题目
在 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
思路
首先理解题意,NN的二维数组中的每个值代表着这个位置上有几个立方体,例如,[[2]]代表11上坐标(0,0)的位置上有2个立方体,[[1,2],[3,4]]则代表着坐标(0,0)(0,1)(1,0)(1,1)上分别有1,2,3,4个立方体,以此类推。
总表面积 - 重叠部分表面积。
一个位置一个位置地进行立体柱表面积累加,当一个位置上有n个小正方体累在一起时,表面积为4n+2(2为上下底面,4n为周围四个面),当沿横向或纵向紧挨继续添加立方体柱时,就会有重叠部分,重叠部分面积为较矮立体柱的个数乘以2(每两个立体柱减少的面积)。
时间复杂度:O(n^2)
空间复杂度:O(1)
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int res = 0;
int row = grid.size(), col = grid[0].size();
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j] > 0) {
res += 4*grid[i][j] + 2;
}
if (i > 0) {
res -= min(grid[i][j], grid[i-1][j]) * 2;
}
if (j > 0) {
res -= min(grid[i][j], grid[i][j-1]) * 2;
}
}
}
return res;
}
};