Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Trapping Rain Water II

Updated
3 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "407" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

Given an m x n integer matrix heightMap representing the height of each unit cell in a 2D elevation map, return the volume of water it can trap after raining. Example 1: Input: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] Output: 4 Explanation: After the rain, water is trapped between the blocks. We have two small ponds 1 and 3 units trapped. The total volume of water trapped is 4. Example 2: Input: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]] Output: 10 Constraints: m == heightMap.length n == heightMap[i].length 1 <= m, n <= 200 0 <= heightMap[i][j] <= 2 * 104

Explanation

  • Min-Heap & Boundary Traversal: Treat the boundary of the matrix as the initial "walls." Use a min-heap to efficiently find the smallest wall.
    • Expanding Inward: Pop the smallest wall from the heap. For each of its neighbors, if the neighbor's height is lower than the current wall's height, water can be trapped. Update the neighbor's height to the wall's height (or higher, if it was already higher) and push it onto the heap.
    • Volume Accumulation: Accumulate the trapped water volume based on the difference between the wall height and the original neighbor height.
  • Runtime Complexity: O(M N log(M + N)), where M is the number of rows and N is the number of columns.
  • Storage Complexity: O(M * N)

Code

    import heapq

def trapRainWater(heights):
    """
    Calculates the amount of trapped rainwater in a 2D elevation map.

    Args:
        heights: A list of lists of integers representing the height map.

    Returns:
        The total volume of trapped rainwater.
    """

    if not heights or not heights[0]:
        return 0

    m, n = len(heights), len(heights[0])
    heap = []
    visited = [[False] * n for _ in range(m)]

    # Add boundary cells to the min-heap
    for i in range(m):
        for j in range(n):
            if i == 0 or i == m - 1 or j == 0 or j == n - 1:
                heapq.heappush(heap, (heights[i][j], i, j))
                visited[i][j] = True

    water = 0
    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]

    while heap:
        height, i, j = heapq.heappop(heap)

        for dx, dy in directions:
            x, y = i + dx, j + dy

            if 0 <= x < m and 0 <= y < n and not visited[x][y]:
                visited[x][y] = True
                water += max(0, height - heights[x][y])
                heapq.heappush(heap, (max(height, heights[x][y]), x, y))

    return water

More from this blog

C

Chatmagic blog

2894 posts