Back to Leetcode Go

892. Surface Area of 3D Shapes

website/content.en/ChapterFour/0800~0899/0892.Surface-Area-of-3D-Shapes.md

1.7.971.9 KB
Original Source

892. Surface Area of 3D Shapes

Problem

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

Problem Summary

On an N * N grid, we place some 1 * 1 * 1  cubes. Each value v = grid[i][j] represents v cubes stacked on the corresponding cell (i, j). Please return the surface area of the final shape.

Solution Approach

  • Given a grid array, where the values represent cubes stacked on their cells, find the surface area of the final stacked cubes.
  • Easy problem. According to the problem statement, find the overlapping faces when stacking, then subtract these overlapping areas from the total surface area to get the final answer.

Code

go

package leetcode

func surfaceArea(grid [][]int) int {
	area := 0
	for i := 0; i < len(grid); i++ {
		for j := 0; j < len(grid[0]); j++ {
			if grid[i][j] == 0 {
				continue
			}
			area += grid[i][j]*4 + 2
			// up
			if i > 0 {
				m := min(grid[i][j], grid[i-1][j])
				area -= m
			}
			// down
			if i < len(grid)-1 {
				m := min(grid[i][j], grid[i+1][j])
				area -= m
			}
			// left
			if j > 0 {
				m := min(grid[i][j], grid[i][j-1])
				area -= m
			}
			// right
			if j < len(grid[i])-1 {
				m := min(grid[i][j], grid[i][j+1])
				area -= m
			}
		}
	}
	return area
}

func min(a, b int) int {
	if a > b {
		return b
	}
	return a
}