Surface Area of 3D Shapes

easy array math geometry matrix

Problem

grid[i][j] is the height of a tower of unit cubes at cell (i, j). Return the total surface area of the resulting 3D shape.

Inputgrid = [[1,2],[3,4]]
Output34
Each tower contributes 4·h + 2 (sides + top + bottom). Subtract 2·min(neighbour) for each shared face.

def surfaceArea(grid):
    n = len(grid)
    total = 0
    for i in range(n):
        for j in range(n):
            h = grid[i][j]
            if h: total += 4 * h + 2
            if i: total -= 2 * min(h, grid[i - 1][j])
            if j: total -= 2 * min(h, grid[i][j - 1])
    return total
function surfaceArea(grid) {
  const n = grid.length;
  let total = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      const h = grid[i][j];
      if (h) total += 4 * h + 2;
      if (i) total -= 2 * Math.min(h, grid[i - 1][j]);
      if (j) total -= 2 * Math.min(h, grid[i][j - 1]);
    }
  }
  return total;
}
class Solution {
    public int surfaceArea(int[][] grid) {
        int n = grid.length, total = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int h = grid[i][j];
                if (h > 0) total += 4 * h + 2;
                if (i > 0) total -= 2 * Math.min(h, grid[i - 1][j]);
                if (j > 0) total -= 2 * Math.min(h, grid[i][j - 1]);
            }
        }
        return total;
    }
}
int surfaceArea(vector<vector<int>>& grid) {
    int n = (int)grid.size(), total = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            int h = grid[i][j];
            if (h) total += 4 * h + 2;
            if (i) total -= 2 * min(h, grid[i - 1][j]);
            if (j) total -= 2 * min(h, grid[i][j - 1]);
        }
    return total;
}
Time: O(n²) Space: O(1)