在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
On a N * N grid, we place some 1 * 1 * 1 cubes.
Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).
Return the total surface area of the resulting shapes.
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
思路
(1)参见:画图、计算三种重叠部分——by liweiwei1419
(2)做减法的思路。先计算整体总面积再减去三个维度的重叠面积。
(3)时间复杂度O(M*N)
(4)类似的问题有 第 11 题:盛最多水的容器;第 42 题:接雨水;第 84 题:柱状图中最大的矩形。
解法
class Solution {
public int surfaceArea(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
int sum = 0;
int v = 0;
int r = 0;
int c = 0;
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
sum += grid[i][j];
if(grid[i][j] > 1 ){
v += grid[i][j]-1;
}
if( j > 0){
// r += grid[i][j-1] < grid[i][j] ? grid[i][j-1] : grid[i][j];
r += Math.min(grid[i][j-1] , grid[i][j]);
}
if( i > 0){
// c += grid[i-1][j] < grid[i][j] ? grid[i-1][j] : grid[i][j];
c += Math.min(grid[i-1][j] , grid[i][j]);
}
}
}
sum = sum * 6 - (v+r+c) * 2;
return sum;
}
}