Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Regions Cut By Slashes

Updated
3 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "959" 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

An n x n grid is composed of 1 x 1 squares where each 1 x 1 square consists of a '/', '\', or blank space ' '. These characters divide the square into contiguous regions. Given the grid grid represented as a string array, return the number of regions. Note that backslash characters are escaped, so a '\' is represented as '\'. Example 1: Input: grid = [" /","/ "] Output: 2 Example 2: Input: grid = [" /"," "] Output: 1 Example 3: Input: grid = ["/\","\/"] Output: 5 Explanation: Recall that because \ characters are escaped, "\/" refers to \/, and "/\" refers to /. Constraints: n == grid.length == grid[i].length 1 <= n <= 30 grid[i][j] is either '/', '\', or ' '.

Explanation

Here's the breakdown of the solution:

  • Subdivide each cell: Treat each 1x1 square in the grid as four smaller triangles. The '/', '\', or ' ' characters determine how these triangles are connected.
  • Union-Find: Use the Union-Find (Disjoint Set Union) data structure to efficiently track connected components among these triangles.
  • Connectivity Rules: Connect the triangles based on the given character in the cell. Adjacent cells share connections across their borders.

  • Runtime Complexity: O(n2), where n is the size of the grid. Storage Complexity: O(n2)

Code

    class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n

    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])  # Path compression
        return self.parent[x]

    def union(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)
        if root_x != root_y:
            if self.rank[root_x] < self.rank[root_y]:
                self.parent[root_x] = root_y
            elif self.rank[root_x] > self.rank[root_y]:
                self.parent[root_y] = root_x
            else:
                self.parent[root_y] = root_x
                self.rank[root_x] += 1


def regions_by_slashes(grid):
    n = len(grid)
    uf = UnionFind(4 * n * n)
    for i in range(n):
        for j in range(n):
            cell_index = 4 * (i * n + j)
            if grid[i][j] == '/':
                uf.union(cell_index + 0, cell_index + 1)
                uf.union(cell_index + 2, cell_index + 3)
            elif grid[i][j] == '\\':
                uf.union(cell_index + 0, cell_index + 3)
                uf.union(cell_index + 1, cell_index + 2)
            else:
                uf.union(cell_index + 0, cell_index + 1)
                uf.union(cell_index + 1, cell_index + 2)
                uf.union(cell_index + 2, cell_index + 3)

            # Connect adjacent cells
            if i > 0:
                uf.union(cell_index + 0, 4 * ((i - 1) * n + j) + 2)  # Up
            if j > 0:
                uf.union(cell_index + 3, 4 * (i * n + (j - 1)) + 1)  # Left

    count = 0
    for i in range(4 * n * n):
        if uf.find(i) == i:
            count += 1
    return count

More from this blog

C

Chatmagic blog

2894 posts