Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Minimum Interval to Include Each Query

Updated
4 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "1851" 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 a 2D integer array intervals, where intervals[i] = [lefti, righti] describes the ith interval starting at lefti and ending at righti (inclusive). The size of an interval is defined as the number of integers it contains, or more formally righti - lefti + 1. You are also given an integer array queries. The answer to the jth query is the size of the smallest interval i such that lefti <= queries[j] <= righti. If no such interval exists, the answer is -1. Return an array containing the answers to the queries. Example 1: Input: intervals = [[1,4],[2,4],[3,6],[4,4]], queries = [2,3,4,5] Output: [3,3,1,4] Explanation: The queries are processed as follows: - Query = 2: The interval [2,4] is the smallest interval containing 2. The answer is 4 - 2 + 1 = 3. - Query = 3: The interval [2,4] is the smallest interval containing 3. The answer is 4 - 2 + 1 = 3. - Query = 4: The interval [4,4] is the smallest interval containing 4. The answer is 4 - 4 + 1 = 1. - Query = 5: The interval [3,6] is the smallest interval containing 5. The answer is 6 - 3 + 1 = 4. Example 2: Input: intervals = [[2,3],[2,5],[1,8],[20,25]], queries = [2,19,5,22] Output: [2,-1,4,6] Explanation: The queries are processed as follows: - Query = 2: The interval [2,3] is the smallest interval containing 2. The answer is 3 - 2 + 1 = 2. - Query = 19: None of the intervals contain 19. The answer is -1. - Query = 5: The interval [2,5] is the smallest interval containing 5. The answer is 5 - 2 + 1 = 4. - Query = 22: The interval [20,25] is the smallest interval containing 22. The answer is 25 - 20 + 1 = 6. Constraints: 1 <= intervals.length <= 105 1 <= queries.length <= 105 intervals[i].length == 2 1 <= lefti <= righti <= 107 1 <= queries[j] <= 107

Explanation

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

  • Sort Intervals by Size: Pre-sort the intervals based on their size (right - left + 1) to efficiently find the smallest interval.
  • Process Queries Offline: Sort the queries along with their original indices. Iterate through the sorted queries and maintain a priority queue (min-heap) of intervals that contain the current query value.
  • Find Smallest Interval: For each query, extract intervals from the priority queue that contain the query value. The smallest such interval (if it exists) is the answer.

  • Runtime Complexity: O(n log n + q log q + q log n), where n is the number of intervals and q is the number of queries.

  • Storage Complexity: O(n + q), to store the sorted intervals, queries, and the result array.

Code

    import heapq

def min_interval(intervals, queries):
    """
    Finds the size of the smallest interval containing each query value.

    Args:
        intervals: A 2D integer array representing intervals.
        queries: An integer array representing query values.

    Returns:
        An array containing the sizes of the smallest intervals for each query.
    """

    intervals_sorted = sorted(intervals, key=lambda x: (x[1] - x[0] + 1))  # Sort by size
    queries_with_indices = sorted([(q, i) for i, q in enumerate(queries)])  # Sort queries with original indices
    result = [-1] * len(queries)
    interval_index = 0
    min_heap = []

    for query, index in queries_with_indices:
        # Add intervals that start before or at the query value to the heap.
        while interval_index < len(intervals_sorted) and intervals_sorted[interval_index][0] <= query:
            heapq.heappush(min_heap, (intervals_sorted[interval_index][1] - intervals_sorted[interval_index][0] + 1, intervals_sorted[interval_index]))
            interval_index += 1

        # Remove intervals from the heap that end before the query value.
        while min_heap and min_heap[0][1][1] < query:
            heapq.heappop(min_heap)

        # If the heap is not empty, the top interval is the smallest containing the query.
        if min_heap:
            size, interval = heapq.heappop(min_heap) #Pop to peek at top interval
            heapq.heappush(min_heap, (size, interval)) #Push back
            if interval[0] <= query <= interval[1]:
              result[index] = size
            else:
              result[index] = -1


    return result

More from this blog

C

Chatmagic blog

2894 posts

Solving Leetcode Interviews in Seconds with AI: Minimum Interval to Include Each Query