715. Range Module
https://leetcode.com/problems/range-module/
My Intuitive Solution using PriorityQueue
addRange:
use priorityQueue to merge intervals
queryRange:
one-pass check boundary
removeRange:
If remove range no intercept, just add current interval
if remove range inside current interval
if remove range intercept left side of current interval
if remove range intercept right side of current interval
import heapq
class RangeModule:
def __init__(self):
self.intervals = []
def addRange(self, left: int, right: int) -> None:
heapq.heappush(self.intervals,[left,right])
#merge
stack = []
while self.intervals:
curr = heapq.heappop(self.intervals)
if not stack:
stack.append(curr)
else:
if stack[-1][1] >= curr[0]:
prev = stack.pop()
stack.append([prev[0],max(prev[1],curr[1])])
else:
stack.append(curr)
self.intervals = stack
# print("add interval")
# print(self.intervals)
def queryRange(self, left: int, right: int) -> bool:
# print("Query")
# print("{} {}".format(left,right))
# print(self.intervals)
for interval in self.intervals:
if left >= interval[0] and interval[1] >= right:
return True
return False
def removeRange(self, left: int, right: int) -> None:
arr = []
for interval in self.intervals:
if interval[1] <= left or interval[0] >= right:
arr.append(interval)
else:
if interval[0] < left and right < interval[1]:
arr.append([interval[0],left])
arr.append([right,interval[1]])
elif interval[1] > left and right>= interval[1]:
arr.append([interval[0],left])
elif left <= interval[0] and interval[0] < right:
arr.append([right,interval[1]])
self.intervals = arr
# print("Remove interval")
# print(self.intervals)
Last updated
Was this helpful?