252. Meeting Rooms

包含判断两个区间相交的基本操作:

  1. var canAttendMeetings = function(intervals) {
  2. let result = true;
  3. intervals.sort((a, b) => a[0] - b[0]); // 必须先排序
  4. for (let i = 1; i < intervals.length; i++) {
  5. if (didOverlap(intervals[i - 1], intervals[i])) {
  6. result = false;
  7. break;
  8. }
  9. }
  10. function didOverlap(range1, range2) { // 判断两个区间是否重叠
  11. let [left1, right1] = range1;
  12. let [left2, right2] = range2;
  13. if (right1 <= left2 || right2 <= left1) { // 取条件好找的
  14. return false;
  15. }
  16. return true;
  17. }
  18. return result;
  19. };

判断区间重叠的方式可以更抽象:
image.png

  1. function didOverlap(range1, range2) { // 判断两个区间是否重叠
  2. let [left1, right1] = range1;
  3. let [left2, right2] = range2;
  4. return Math.max(left1, left2) < Math.min(right1, right2);
  5. }

57. Insert Interval

题解:https://leetcode-cn.com/problems/insert-interval/solution/shou-hua-tu-jie-57-cha-ru-qu-jian-fen-cheng-3ge-ji/

  1. var insert = function(intervals, newInterval) {
  2. let n = intervals.length;
  3. if (n === 0) {
  4. return [newInterval];
  5. }
  6. let [left, right] = newInterval;
  7. let ans = [];
  8. let i = 0;
  9. // 第一段
  10. while (i < n) {
  11. let [_left, _right] = intervals[i];
  12. if (_right < left) {
  13. ans.push(intervals[i]);
  14. i++;
  15. } else {
  16. break;
  17. }
  18. }
  19. // 第二段
  20. let newLeft = left;
  21. let newRight = right;
  22. while(i < n) {
  23. let [_left, _right] = intervals[i];
  24. if (_left <= right) { // 相交,这个条件判断很牛啊
  25. newLeft = Math.min(_left, left, newLeft);
  26. newRight = Math.max(_right, right, newRight);
  27. i++;
  28. } else {
  29. break;
  30. }
  31. }
  32. ans.push([newLeft, newRight]);
  33. // 第三段
  34. while(i < n) { // 后面直接收割
  35. ans.push(intervals[i]);
  36. i++;
  37. }
  38. return ans;
  39. };

1272. Remove Interval

删除区间,利用求交集

  1. var removeInterval = function(intervals, toBeRemoved) {
  2. let [left, right] = toBeRemoved;
  3. if (left >= right) {
  4. return intervals; // 啥也不干
  5. }
  6. let ans = [];
  7. for (let interval of intervals) {
  8. let [_left, _right] = interval;
  9. if (right <= _left || _right <= left) { // 不相交
  10. ans.push(interval);
  11. } else { // 这里的写法很有特色,重点记忆一下
  12. if (_left < left) {
  13. ans.push([_left, left])
  14. }
  15. if (right < _right) {
  16. ans.push([right, _right]);
  17. }
  18. }
  19. }
  20. return ans;
  21. };