题目

类型:Design
image.png

解题思路

image.png

image.png

代码

  1. class SummaryRanges {
  2. TreeMap<Integer, Integer> intervals;
  3. public SummaryRanges() {
  4. intervals = new TreeMap<Integer, Integer>();
  5. }
  6. public void addNum(int val) {
  7. // 找到 l1 最小的且满足 l1 > val 的区间 interval1 = [l1, r1]
  8. // 如果不存在这样的区间,interval1 为尾迭代器
  9. Map.Entry<Integer, Integer> interval1 = intervals.ceilingEntry(val + 1);
  10. // 找到 l0 最大的且满足 l0 <= val 的区间 interval0 = [l0, r0]
  11. // 在有序集合中,interval0 就是 interval1 的前一个区间
  12. // 如果不存在这样的区间,interval0 为尾迭代器
  13. Map.Entry<Integer, Integer> interval0 = intervals.floorEntry(val);
  14. if (interval0 != null && interval0.getKey() <= val && val <= interval0.getValue()) {
  15. // 情况一
  16. return;
  17. } else {
  18. boolean leftAside = interval0 != null && interval0.getValue() + 1 == val;
  19. boolean rightAside = interval1 != null && interval1.getKey() - 1 == val;
  20. if (leftAside && rightAside) {
  21. // 情况四
  22. int left = interval0.getKey(), right = interval1.getValue();
  23. intervals.remove(interval0.getKey());
  24. intervals.remove(interval1.getKey());
  25. intervals.put(left, right);
  26. } else if (leftAside) {
  27. // 情况二
  28. intervals.put(interval0.getKey(), interval0.getValue() + 1);
  29. } else if (rightAside) {
  30. // 情况三
  31. int right = interval1.getValue();
  32. intervals.remove(interval1.getKey());
  33. intervals.put(val, right);
  34. } else {
  35. // 情况五
  36. intervals.put(val, val);
  37. }
  38. }
  39. }
  40. public int[][] getIntervals() {
  41. int size = intervals.size();
  42. int[][] ans = new int[size][2];
  43. int index = 0;
  44. for (Map.Entry<Integer, Integer> entry : intervals.entrySet()) {
  45. int left = entry.getKey(), right = entry.getValue();
  46. ans[index][0] = left;
  47. ans[index][1] = right;
  48. ++index;
  49. }
  50. return ans;
  51. }
  52. }