一、判断区间是否重叠
力扣 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;
};