题目链接: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
文章讲解:代码随想录
视频讲解:贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili
题解1:贪心算法
思路:先将区间按左边界排序,然后遍历。局部最优为当两个区间重叠时,删除右边界较大的区间,全局最优为删除区间最少。
/**
* @param {number[][]} intervals
* @return {number}
*/
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a, b) => a[0] - b[0]);
let res = 0;
for (let i = 1; i < intervals.length; i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
res++; // 当前区间的左边界比上个区间右边界小,说明区间重合,需要删除其中右边界较大的一个
intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]); // 更新右边界
}
}
return res;
};
分析:时间复杂度为 O(nlogn),空间复杂度为 O(1)。
收获
贪心算法求解重叠区间问题,先将区间按一个维度排序,在遍历的过程中更新另一个维度。如果每一步局部最优能推导出全局最优,就可以用贪心算法求解。