https://leetcode.com/contest/weekly-contest-293/problems/count-integers-in-intervals/
本身不是什么很精巧的题目,合并区间就完事了,但是自己调试了很久,还是对于边界的处理不够优雅和全面。
记下这道题的解法,回顾左右边界值的考虑。
题目解析就不写了,还是看代码来得实在。

个人解答

  1. from sortedcontainers import SortedList
  2. class CountIntervals:
  3. def __init__(self):
  4. self.cnt = 0
  5. self.intervals = SortedList([(-inf, -inf), (inf, inf)])
  6. def add(self, left: int, right: int) -> None:
  7. i = self.intervals.bisect((left, right))
  8. # consider left one
  9. if self.intervals[i - 1][1] >= left:
  10. i -= 1
  11. left = self.intervals[i][0]
  12. # right overlap
  13. while i < len(self.intervals) and self.intervals[i][0] <= right:
  14. l, r = self.intervals.pop(i)
  15. right = max(right, r)
  16. self.cnt -= r - l + 1
  17. self.intervals.add((left, right))
  18. self.cnt += right - left + 1
  19. def count(self) -> int:
  20. return self.cnt

注意的几个点:

  • 边界值的判断,index判断,或者采用解答中的添加guard值
  • 涉及删除操作(pop)时,考虑遍历时发生的变化
  • 考虑左右处理的先后,会不会互相影响