#715

Range Module

Hard
DesignSegment TreeOrdered SetInterval MergingSegment Trees
LeetCode ↗

Approaches

Brute ForceOptimal
Complexity Comparison
Brute ForceOptimal Solution
Time
O(n²)
O(n)
Space
O(1)
O(n)
💡

Intuition

Time O(n)Space O(n)

The optimal solution uses a sorted list of intervals to efficiently manage overlapping ranges. By merging intervals when adding or removing ranges, we can keep track of disjoint intervals, making queries faster.

⚙️

Algorithm

4 steps
  1. 1Step 1: Maintain a list of intervals sorted by the starting point.
  2. 2Step 2: For addRange, merge overlapping intervals and insert the new range.
  3. 3Step 3: For removeRange, split intervals that overlap with the range to be removed.
  4. 4Step 4: For queryRange, check if the range is fully covered by existing intervals.
solution.py38 lines
1# Full working Python code
2class RangeModule:
3    def __init__(self):
4        self.intervals = []
5
6    def addRange(self, left: int, right: int) -> None:
7        new_intervals = []
8        i = 0
9        while i < len(self.intervals) and self.intervals[i][1] < left:
10            new_intervals.append(self.intervals[i])
11            i += 1
12        while i < len(self.intervals) and self.intervals[i][0] < right:
13            left = min(left, self.intervals[i][0])
14            right = max(right, self.intervals[i][1])
15            i += 1
16        new_intervals.append((left, right))
17        while i < len(self.intervals):
18            new_intervals.append(self.intervals[i])
19            i += 1
20        self.intervals = new_intervals
21
22    def queryRange(self, left: int, right: int) -> bool:
23        for start, end in self.intervals:
24            if start < right and left < end:
25                return start <= left and right <= end
26        return False
27
28    def removeRange(self, left: int, right: int) -> None:
29        new_intervals = []
30        for start, end in self.intervals:
31            if end <= left or start >= right:
32                new_intervals.append((start, end))
33            else:
34                if start < left:
35                    new_intervals.append((start, left))
36                if end > right:
37                    new_intervals.append((right, end))
38        self.intervals = new_intervals

Complexity note: The time complexity is O(n) for addRange and removeRange because we may need to merge or split intervals, which requires iterating through the list of intervals. Querying is O(log n) due to binary search-like behavior when checking intervals.

  • 1Using a sorted list of intervals allows for efficient merging and querying.
  • 2Understanding how to manage overlapping intervals is crucial for this problem.

Solutions and explanations are original Tejav content. Problem titles © LeetCode — use the LeetCode button above for the full problem statement.