官方网址:. - 力扣(LeetCode)
题目:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。返回插入之后的 intervals。
注意 :你不需要原地修改 intervals。你可以创建一个新数组然后返回它。
个人思路:
题解:首先判断intervals数组长度,如果为0可以直接将newInterval返回
其他情况:将newIntervals插入到intervals中,对intervals按照左端点递增的顺序进行排序
代码思路:
- 定义一个辅助数组,也是我们的答案。默认为Intervals的第一个元素
- 然后从下标1开始遍历,如果位置为i的左端点比当前res位置的右端点还要大,很明显不能合并直接插入,更新当前元素的位置
- 如果小于等于的话,需要合并区间。左端点不变,右端点取当前遍历元素和当前ptr位置元素右端点的最大值即可。由于是合并区间所以,ptr值不需要更新
代码(非最优):
代码:/**
* @param {number[][]} intervals
* @param {number[]} newInterval
* @return {number[][]}
*/
var insert = function(intervals, newInterval) {
if(intervals.length === 0) return [newInterval]
intervals.push(newInterval)
intervals.sort((a, b) => a[0] - b[0])
const res = [intervals[0]]
let ptr = 0
for(let i = 1; i < intervals.length; i++) {
if(intervals[i][0] > res[ptr][1]) {
res.push(intervals[i])
ptr++
} else {
res[ptr] = [res[ptr][0], Math.max(res[ptr][1], intervals[i][1])]
}
}
return res
};