-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContents.swift
62 lines (43 loc) · 1.51 KB
/
Contents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//: [上一道题](@previous)
/*:
# 三维形体的表面积
- 题号:[892](https://leetcode-cn.com/problems/surface-area-of-3d-shapes/)
- 难度:简单
- 描述:
在 `N*N` 的网格上,我们放置一些 `1*1*1` 的立方体。
每个值 `v = grid[i][j]` 表示 `v` 个正方体叠放在对应单元格 `(i, j)` 上。
请你返回最终形体的表面积。
*/
//: ## Code
import Foundation
func surfaceArea(_ grid: [[Int]]) -> Int {
guard !grid.isEmpty else { return 0 }
// 面数
var faceCount = 0
for i in 0 ..< grid.count {
let tmp = grid[i]
for j in 0 ..< tmp.count {
// 立方体个数
let n = grid[i][j]
guard n != 0 else { continue }
// 记录 该位置的最大面数
faceCount += 6 * n - 2 * (n - 1)
// 减去右侧以及下侧面数 * 2
if i + 1 < grid.count {
faceCount -= min(n, grid[i + 1][j]) * 2
}
if j + 1 < tmp.count {
faceCount -= min(n, tmp[j + 1]) * 2
}
}
}
return faceCount
}
//: ## Test
print(surfaceArea([[], []])) // 0
print(surfaceArea([[2]])) // 10
print(surfaceArea([[1,2],[3,4]])) // 34
print(surfaceArea([[1,0],[0,2]])) // 16
print(surfaceArea([[1,1,1],[1,0,1],[1,1,1]])) // 32
print(surfaceArea([[2,2,2],[2,1,2],[2,2,2]])) // 46
//: [下一道题](@next)