892. Surface Area of 3D Shapes (Easy)
https://leetcode.com/problems/surface-area-of-3d-shapes/
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.
Example 1:
Input: [[2]] Output: 10
Example 2:
Input: [[1,2],[3,4]] Output: 34
Example 3:
Input: [[1,0],[0,2]] Output: 16
Example 4:
Input: [[1,1,1],[1,0,1],[1,1,1]] Output: 32
Example 5:
Input: [[2,2,2],[2,1,2],[2,2,2]] Output: 46
Note:
1 <= N <= 50
0 <= grid[i][j] <= 50
Solutions
class Solution {
public int surfaceArea(int[][] grid) {
int[] dr = new int[]{0, 1, 0, -1};
int[] dc = new int[]{1, 0, -1, 0};
int N = grid.length;
int ans = 0;
for (int r = 0; r < N; ++r) {
for (int c = 0; c < N; ++c) {
if (grid[r][c] <= 0) {
continue;
}
// at least two facets will not be covered by other cubes
// they are respectively the bottom most and the top most facets
ans += 2;
// check four horizontal directions
for (int k = 0; k < 4; ++k) {
int nr = r + dr[k];
int nc = c + dc[k];
int nv = 0;
// verify whether coordinate is valid
if (0 <= nr && nr < N && 0 <= nc && nc < N) {
nv = grid[nr][nc];
}
// if height of neighbor cube tower is equal or higher than current one
// all the facets on corresponding direction are all blocked out.
ans += Math.max(grid[r][c] - nv, 0);
}
}
}
return ans;
}
}