一、判断区间是否重叠
力扣 252. 会议室
给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。
思路分析
因为一个人在同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间,将区间按照会议开始时间进行排序,然后遍历一遍判断即可。
代码实现
var canAttendMeetings = function (intervals) {// 先根据最小值进行排序。intervals.sort((a, b) => a[0] - b[0]);for (let i = 1; i < intervals.length; i++) {if (intervals[i][0] < intervals[i - 1][1]) {return false;}}return true;
};
二、合并区间
56.合并区间
https://leetcode.cn/problems/merge-intervals/description/。
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
/*** @param {number[][]} intervals* @return {number[][]}*/
var merge = function(intervals) {// 先根据最小值进行排序。intervals.sort((a, b) => a[0] - b[0]);let merged = [intervals[0]];for (let i = 1; i < intervals.length; i++) {if(intervals[i][0] > merged[merged.length - 1][1]){merged.push(intervals[i]);}else{merged[merged.length - 1][1] = Math.max(merged[merged.length - 1][1], intervals[i][1]);}}return merged;
};
57. 插入区间
给你一个 无重叠的 *,*按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
思路一:
先根据区间的起始找到插入的位置,
再对区间进行遍历,对区间进行合并。
/*** @param {number[][]} intervals* @param {number[]} newInterval* @return {number[][]}*/
var insert = function(intervals, newInterval) {let i = 0;for(i = 0; i < intervals.length; i++){if(newInterval[0] < intervals[i][0]){intervals.splice(i, 0, newInterval);break;}}if(i === intervals.length){intervals.push(newInterval);}// 进行合并let merged = [intervals[0]];for(let i = 1; i < intervals.length ; i++){if(intervals[i][0] <= merged.at(-1)[1]){merged.at(-1)[1] = Math.max(merged.at(-1)[1], intervals[i][1]);}else{merged.push(intervals[i]);}}return merged;
};
思路二:
初始化结果区间merged = []
遍历到某个区间:
- 如果这个区间在new区间的左边且没有交集,则将该区间加入到merged;
- 如果这个区间是在new区间的右边,并且是第一次出现,则将new区间加入merged,并且也将该区间加入到merged;
- 如果这个区间是在new区间的右边,但是不是第一次出现,因为之前已经将new区间加入到merged 了,所以这次只需要将该区间加入到merged;
- 如果不是以上的情况,说明new和该区间有交集,维护new区间的left 和right。
var insert = function (intervals, newInterval) {let [left, right] = newInterval; // 解构赋值,将newInterval的值分别赋给left和right变量。]let merged = [];let flag = true; // 判断是否需要插入for (let i = 0; i < intervals.length; i++) {const [start, end] = intervals[i];if (end < left) {merged.push(intervals[i]);} else if (start > right) {if (flag) {merged.push([left, right]);flag = false;}merged.push(intervals[i]);} else {left = Math.min(left, start);right = Math.max(right, end);}}if (flag) {merged.push([left, right]);}return merged;
};