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