题目
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
eg:
输入:[[2]]
输出:10
分析
这题唯一的难点应该是读懂题意
在这里插入来自题解Sweetiee的图:
对于[[1,2],[3,4]]意思是[0,0]一块积木,[0,1]两块积木,[1,0]三块积木等等。
对于此题我的解法是将表面积分成3份:
- 上下表面积:矩阵中不为0的个数
- 外圈表面积:边缘部分的表面积总和(四个角应该加2次)
- 内圈表面积:相邻两个坐标积木之差(相当于额外露出来的面积)
Python解法
class Solution:
def surfaceArea(self, grid: List[List[int]]) -> int:
s1 = 0
s2 = 0
s3 = 0
n = len(grid)
# 上下面(不为0的块*2)
for i in range(n):
for j in range(n):
if grid[i][j] != 0:
s1 += 1
s1 *= 2
# 外侧面1(合)
for i in range(n):
s2 = s2 + grid[i][0] + grid[i][n-1]
for j in range(n):
s2 = s2 + grid[0][j] + grid[n-1][j]
# 内侧面 (差)
for i in range(n):
for j in range(n-1):
s3 += abs(grid[i][j] - grid[i][j+1])
for j in range(n):
for i in range(n-1):
s3 += abs(grid[i][j] - grid[i+1][j])
return s1+s2+s3
AC结果
C++解法
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int n = grid.size();
int s = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(grid[i][j] != 0){
s+=2;
}
}
}
for(int i = 0; i < n; i++){
s += grid[i][0] + grid[i][n-1];
s += grid[0][i] + grid[n-1][i];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n-1; j++){
s += abs(grid[i][j]-grid[i][j+1]);
}
}
for(int j = 0; j < n; j++){
for(int i = 0; i < n-1; i++){
s += abs(grid[i][j]-grid[i+1][j]);
}
}
return s;
}
};