# Leetcode – Surface Area of 3D Shapes Solution in Python

The fascinating world of 3D geometry can be wonderfully perplexing and presents an interesting blend of mathematics and algorithmic thinking. The “Surface Area of 3D Shapes” problem on Leetcode is an intriguing challenge that requires visualizing 3D structures based on a 2D input. In this article, we’ll break down the problem’s essence, the insights that guide us towards a solution, and provide a Python implementation to solve it.

## Problem Statement

You are given an N x N grid of positive integers grid, representing the heights of 3D blocks placed in a 2×2 square cell.

The task is to return the total surface area of the resulting 3D shape.

### Constraints:

• 1 <= N <= 50
• 0 <= grid[i][j] <= 50

### Examples:

1. Input: [] Output: 10
2. Input: [[1,2],[3,4]] Output: 34
3. Input: [[1,0],[0,2]] Output: 16

## Analysis

To determine the surface area of 3D shapes in the grid, we must take into account:

1. Top and Bottom Surfaces: Every unit height in the grid contributes 2 units to the surface area (the top and bottom surfaces).
2. Side Surfaces: These depend on the height difference between adjacent cells. For instance, if a cell has height 5 and its adjacent cell has height 2, then the exposed surface is 5 - 2 = 3.
3. Edge Cases: For cells on the edges of the grid, the sides exposed outside the grid also contribute to the surface area.

Using these insights, we can iteratively compute the surface area for every cell and sum them up to get the final answer.

## Solution Strategy

1. Initialize the Total Area: Start with the assumption that all cells in the grid are isolated. Thus, the initial area contributed by each cell is 4 * height + 2.
• For every pair of adjacent cells, determine their height difference. Subtract the minimum of the two heights from the total area (because this part is not exposed).
• This needs to be done for both horizontal and vertical pairs.
3. Sum Up: Aggregate the adjusted areas to get the total surface area.

### Python Code:

def surfaceArea(grid: List[List[int]]) -> int:
N = len(grid)
area = 0

for i in range(N):
for j in range(N):
if grid[i][j]:
# Top and bottom surface
area += 2

# For four directions: up, down, left, right
for x, y in [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]:
if 0 <= x < N and 0 <= y < N:
# Subtract the minimum height between current and adjacent cell
area += max(grid[i][j] - grid[x][y], 0)
else:
# If adjacent cell is outside the grid, add the current height
area += grid[i][j]

return area

## Complexity Analysis

1. Time Complexity: We iterate over the entire grid, and for each cell, we perform constant-time operations. Thus, the time complexity is O(N^2), where N is the dimension of the grid.
2. Space Complexity: We use a constant amount of space, leading to a space complexity of O(1).

## Extensions and Real-World Applications

While this problem is a mathematical challenge in a simulated environment, understanding 3D structures from 2D inputs has real-world applications:

1. Computer Graphics: Understanding the surface areas, orientations, and adjacencies can be crucial in rendering objects.
2. Geographical Information Systems (GIS): Translating 2D map data into 3D visualizations.

## Conclusion

The Surface Area of 3D Shapes problem tests the candidate’s ability to think spatially and algorithmically. It demonstrates the importance of visualizing problems, especially when the context is geometric. This challenge not only refines one’s algorithmic thinking but also expands their appreciation for the beauty of geometry in programming.