在 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
- 加法:每个位置V贡献的面积 = 顶 + 底 + 侧面
- 减法:总面积 - 重叠的面积
// add
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
if (grid.empty()) {
return 0;
}
int row = grid.size();
int col = grid[0].size();
int x[4] = { -1, 0, 1, 0 };
int y[4] = { 0, 1, 0, -1 };
int rst = 0;
for (size_t i = 0; i < row; i++) {
for (size_t j = 0; j < col; j++) {
if (grid[i][j] != 0) {
rst += 2; // 顶和底
for (size_t q = 0; q < 4; q++) {
int tmpX = i + x[q];
int tmpY = j + y[q];
if (tmpX >= 0 && tmpX < row && tmpY >= 0 && tmpY < col) {
rst += max(grid[i][j] - grid[tmpX][tmpY], 0); // 差值
} else {
rst += grid[i][j]; // 边界
}
}
}
}
}
return rst;
}
};
// delete
class SolutionDel {
public:
int surfaceArea(vector<vector<int>>& grid) {
if (grid.empty()) {
return 0;
}
int row = grid.size();
int col = grid[0].size();
int x[4] = { -1, 0, 1, 0 };
int y[4] = { 0, 1, 0, -1 };
int rst = 0;
for (size_t i = 0; i < row; i++) {
for (size_t j = 0; j < col; j++) {
if (grid[i][j] != 0) {
rst += (6 * grid[i][j]); // 6个面
rst -= (2 * (grid[i][j] - 1)); // 叠放重叠部分
for (size_t q = 0; q < 4; q++) {
int tmpX = i + x[q];
int tmpY = j + y[q];
if (tmpX >= 0 && tmpX < row && tmpY >= 0 && tmpY < col) {
rst -= min(grid[i][j], grid[tmpX][tmpY]); // 重叠部分
}
}
}
}
}
return rst;
}
};