每日一题(力扣)---插入区间

发布于:2024-04-10 ⋅ 阅读:(180) ⋅ 点赞:(0)

官方网址:. - 力扣(LeetCode)

题目:

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。返回插入之后的 intervals


注意 :你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

个人思路:

题解:首先判断intervals数组长度,如果为0可以直接将newInterval返回

其他情况:将newIntervals插入到intervals中,对intervals按照左端点递增的顺序进行排序

代码思路:

  1. 定义一个辅助数组,也是我们的答案。默认为Intervals的第一个元素
  2. 然后从下标1开始遍历,如果位置为i的左端点比当前res位置的右端点还要大,很明显不能合并直接插入,更新当前元素的位置
  3. 如果小于等于的话,需要合并区间。左端点不变,右端点取当前遍历元素和当前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
};