Range Module — LeetCode 715 Python Solution
HardDesignSegment TreeOrdered Set
- Problem
- #715
- Reading time
- 14 min
- Source
- leetcode.com
The problem
A Range Module is a module that tracks ranges of numbers. Design a data structure to track the ranges represented as half-open intervals and query about them.
Example
- Input
- ["RangeModule", "addRange", "removeRange", "queryRange", "queryRange", "queryRange"]
- Output
- [null, null, null, true, false, true]
- Explanation
- RangeModule rangeModule = new RangeModule();
Python solution
Python
class Node:
__slots__ = ['left', 'right', 'add', 'v']
def __init__(self):
self.left = None
self.right = None
self.add = 0
self.v = False
class SegmentTree:
__slots__ = ['root']
def __init__(self):
self.root = Node()
def modify(self, left, right, v, l=1, r=int(1e9), node=None):
if node is None:
node = self.root
if l >= left and r <= right:
if v == 1:
node.add = 1
node.v = True
else:
node.add = -1
node.v = False
return
self.pushdown(node)
mid = (l + r) >> 1
if left <= mid:
self.modify(left, right, v, l, mid, node.left)
if right > mid:
self.modify(left, right, v, mid + 1, r, node.right)
self.pushup(node)
def query(self, left, right, l=1, r=int(1e9), node=None):
if node is None:
node = self.root
if l >= left and r <= right:
return node.v
self.pushdown(node)
mid = (l + r) >> 1
v = True
if left <= mid:
v = v and self.query(left, right, l, mid, node.left)
if right > mid:
v = v and self.query(left, right, mid + 1, r, node.right)
return v
def pushup(self, node):
node.v = bool(node.left and node.left.v and node.right and node.right.v)
def pushdown(self, node):
if node.left is None:
node.left = Node()
if node.right is None:
node.right = Node()
if node.add:
node.left.add = node.right.add = node.add
node.left.v = node.add == 1
node.right.v = node.add == 1
node.add = 0
class RangeModule:
def __init__(self):
self.tree = SegmentTree()
def addRange(self, left: int, right: int) -> None:
self.tree.modify(left, right - 1, 1)
def queryRange(self, left: int, right: int) -> bool:
return self.tree.query(left, right - 1)
def removeRange(self, left: int, right: int) -> None:
self.tree.modify(left, right - 1, -1)
# Your RangeModule object will be instantiated and called as such:
# obj = RangeModule()
# obj.addRange(left,right)
# param_2 = obj.queryRange(left,right)
# obj.removeRange(left,right)Complexity
| Measure | Complexity |
|---|---|
| Time | Varies by operation |
| Space | O(m \times \log n) auxiliary |
Related problems
Frequently asked questions
- How hard is LeetCode 715. Range Module?
- LeetCode 715. Range Module is rated Hard on LeetCode.
- What is the time complexity of LeetCode 715. Range Module?
- The Python solution on this page runs in Varies by operation.
- What is the space complexity of LeetCode 715. Range Module?
- The Python solution on this page uses O(m \times \log n) auxiliary space.
- What topics does LeetCode 715. Range Module cover?
- LeetCode 715. Range Module is tagged Design, Segment Tree and Ordered Set on LeetCode.