在 N * N
的网格上,我们放置一些 1 * 1 * 1
的立方体。
每个值 v = grid[i][j]
表示 v
个正方体叠放在单元格 (i, j)
上。
返回结果形体的总表面积。
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
示例 3:
输入:[[1,0],[0,2]]
输出:16
示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
排名第一dalao的答案
分析:
看不懂!(逃
乱分析一波
sum是方块的个数,
ans减去自己那格重叠的面,再减去和四周的重合面
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int ans = 0;
if(grid.empty() || grid[0].empty()) return ans;
int n = grid.size(), m = grid[0].size();
int sum = 0;
vector<vector<int>> dir{{0,1},{1,0},{0,-1},{-1,0}};
for(int i=0;i<n;i++) for(int j=0;j<m;j++) {
sum += grid[i][j];
ans -= max(0, 2 * (grid[i][j] - 1));
for(auto &d : dir) {
int i2 = i + d[0], j2 = j + d[1];
if(i2 < 0 || i2 >= n || j2 < 0 || j2 >= m) continue;
int t = min(grid[i][j], grid[i2][j2]);
ans -= t;
}
}
ans += 6 * sum;
return ans;
}
};