「LeetCode」435-无重叠区间

165 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

一.题目:

435. 无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104

二、思路分析:

这道题目用到了贪心算法,关于区间调度问题我们都利用了贪心算法的思想,对于这道题因为我们需要返回剩余区间不重叠的最小移除量,所以我们反思维求出最大的不相交区间即可。所以这道题目的基本思路为:

  • 先对数组的每个区间进行排序,即对元素数组的第二个元素进行升序排序,这样我们可以保证数组可以按第二个元素有序排序。
  • 随后取得最小的end(即每个小数组的第二个元素),然后拿着这个end与后一个元素数组的第一个元素即start进行比较,如果start大于等于end,那么我们将相交区间数+1,然后将end重新赋值成后一个元素数组的第二个元素,一直重复循环操作,碰到不符合的就直接略过就相当于不算不相交数组内。最终就是最大的不相交数组量,最终结果就是利用原始数组的长度减去最大不相交数组量就可以得出最小删除数组量。

image.png

三、代码:

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var eraseOverlapIntervals = function(intervals) {
    //区间调度算法
    let n = intervals.length
    //按照第二个元素的升序排列
    intervals.sort((a,b) => a[1]-b[1])
    function intervalSchedule(intervals){
        //统计不相交的区间,默认为1
        let count = 1
        let end = intervals[0][1]
        for(let i=1 ; i<intervals.length ; i++){
            let start = intervals[i][0]
            if(start >= end){
                end = intervals[i][1]
                count++
            }
        }
        return count
    }
    return n-intervalSchedule(intervals)
};

四、总结:

区间调度算法是经典的贪心思路,我们就是需要寻找最优策略来得到最终的结果,所以以后如果碰到了类似这种题目都可以使用区间调度算法