Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Random Point in Non-overlapping Rectangles

Updated
3 min read

Introduction

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

You are given an array of non-overlapping axis-aligned rectangles rects where rects[i] = [ai, bi, xi, yi] indicates that (ai, bi) is the bottom-left corner point of the ith rectangle and (xi, yi) is the top-right corner point of the ith rectangle. Design an algorithm to pick a random integer point inside the space covered by one of the given rectangles. A point on the perimeter of a rectangle is included in the space covered by the rectangle. Any integer point inside the space covered by one of the given rectangles should be equally likely to be returned. Note that an integer point is a point that has integer coordinates. Implement the Solution class: Solution(int[][] rects) Initializes the object with the given rectangles rects. int[] pick() Returns a random integer point [u, v] inside the space covered by one of the given rectangles. Example 1: Input ["Solution", "pick", "pick", "pick", "pick", "pick"] [[[[-2, -2, 1, 1], [2, 2, 4, 6]]], [], [], [], [], []] Output [null, [1, -2], [1, -1], [-1, -2], [-2, -2], [0, 0]] Explanation Solution solution = new Solution([[-2, -2, 1, 1], [2, 2, 4, 6]]); solution.pick(); // return [1, -2] solution.pick(); // return [1, -1] solution.pick(); // return [-1, -2] solution.pick(); // return [-2, -2] solution.pick(); // return [0, 0] Constraints: 1 <= rects.length <= 100 rects[i].length == 4 -109 <= ai < xi <= 109 -109 <= bi < yi <= 109 xi - ai <= 2000 yi - bi <= 2000 All the rectangles do not overlap. At most 104 calls will be made to pick.

Explanation

Here's the breakdown of the approach, complexity, and Python code:

  • Key Approach:

    • Calculate the area of each rectangle and store the cumulative area. This allows us to use binary search to efficiently determine which rectangle a randomly generated point falls within based on its weighted probability (area).
    • Generate a random number within the total area covered by all rectangles.
    • Use binary search on the cumulative areas to identify the selected rectangle. Generate a random x and y coordinate within the bounds of the selected rectangle.
  • Complexity:

    • Runtime: O(n) for initialization. O(log n) for each pick() operation, where n is the number of rectangles.
    • Storage: O(n) to store cumulative areas and the input rectangles.
  • Python Code:

Code

    import randomimport bisect

class Solution:
    def __init__(self, rects):
        self.rects = rects
        self.areas = []
        total_area = 0
        for a, b, x, y in rects:
            total_area += (x - a + 1) * (y - b + 1)
            self.areas.append(total_area)

    def pick(self):
        rand_area = random.randint(1, self.areas[-1])
        rect_index = bisect.bisect_left(self.areas, rand_area)
        a, b, x, y = self.rects[rect_index]
        width = x - a + 1
        height = y - b + 1

        # Calculate the offset within the rectangle
        area_before = 0
        if rect_index > 0:
            area_before = self.areas[rect_index-1]
        offset = rand_area - area_before - 1

        rand_x = a + (offset % width)
        rand_y = b + (offset // width)

        return [rand_x, rand_y]

More from this blog

C

Chatmagic blog

2894 posts

Solving Leetcode Interviews in Seconds with AI: Random Point in Non-overlapping Rectangles