252. Meeting Rooms
包含判断两个区间相交的基本操作:
var canAttendMeetings = function(intervals) {let result = true;intervals.sort((a, b) => a[0] - b[0]); // 必须先排序for (let i = 1; i < intervals.length; i++) {if (didOverlap(intervals[i - 1], intervals[i])) {result = false;break;}}function didOverlap(range1, range2) { // 判断两个区间是否重叠let [left1, right1] = range1;let [left2, right2] = range2;if (right1 <= left2 || right2 <= left1) { // 取条件好找的return false;}return true;}return result;};
判断区间重叠的方式可以更抽象:
function didOverlap(range1, range2) { // 判断两个区间是否重叠let [left1, right1] = range1;let [left2, right2] = range2;return Math.max(left1, left2) < Math.min(right1, right2);}
57. Insert Interval
var insert = function(intervals, newInterval) {let n = intervals.length;if (n === 0) {return [newInterval];}let [left, right] = newInterval;let ans = [];let i = 0;// 第一段while (i < n) {let [_left, _right] = intervals[i];if (_right < left) {ans.push(intervals[i]);i++;} else {break;}}// 第二段let newLeft = left;let newRight = right;while(i < n) {let [_left, _right] = intervals[i];if (_left <= right) { // 相交,这个条件判断很牛啊newLeft = Math.min(_left, left, newLeft);newRight = Math.max(_right, right, newRight);i++;} else {break;}}ans.push([newLeft, newRight]);// 第三段while(i < n) { // 后面直接收割ans.push(intervals[i]);i++;}return ans;};
1272. Remove Interval
删除区间,利用求交集
var removeInterval = function(intervals, toBeRemoved) {let [left, right] = toBeRemoved;if (left >= right) {return intervals; // 啥也不干}let ans = [];for (let interval of intervals) {let [_left, _right] = interval;if (right <= _left || _right <= left) { // 不相交ans.push(interval);} else { // 这里的写法很有特色,重点记忆一下if (_left < left) {ans.push([_left, left])}if (right < _right) {ans.push([right, _right]);}}}return ans;};
