https://leetcode.com/contest/weekly-contest-293/problems/count-integers-in-intervals/
本身不是什么很精巧的题目,合并区间就完事了,但是自己调试了很久,还是对于边界的处理不够优雅和全面。
记下这道题的解法,回顾左右边界值的考虑。
题目解析就不写了,还是看代码来得实在。
个人解答
from sortedcontainers import SortedList
class CountIntervals:
def __init__(self):
self.cnt = 0
self.intervals = SortedList([(-inf, -inf), (inf, inf)])
def add(self, left: int, right: int) -> None:
i = self.intervals.bisect((left, right))
# consider left one
if self.intervals[i - 1][1] >= left:
i -= 1
left = self.intervals[i][0]
# right overlap
while i < len(self.intervals) and self.intervals[i][0] <= right:
l, r = self.intervals.pop(i)
right = max(right, r)
self.cnt -= r - l + 1
self.intervals.add((left, right))
self.cnt += right - left + 1
def count(self) -> int:
return self.cnt
注意的几个点:
- 边界值的判断,index判断,或者采用解答中的添加guard值
- 涉及删除操作(
pop
)时,考虑遍历时发生的变化 - 考虑左右处理的先后,会不会互相影响