1.题目链接:
给定一个区间的集合intervals ,其中 intervals[i] = [start(i), end(i)] 。返回 需要移除区间的最小数量,使剩余区间互不重叠。
示例 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
解释:你不需要移除任何区间,因为它们已经是无重叠的了。
提示:
◦ |
| |
◦ |
| |
◦ | -5 * 10^4 <= start(i) < end(i) <= 5 * 10^4 |
3. 解法(贪心):
贪心策略:
a. 按照「左端点」排序;
b. 当两个区间「重叠」的时候,为了能够「在移除某个区间后,保留更多的区间」,我们应该把「区间范围较大」的区间移除。
如何移除区间范围较大的区间:
由于已经按照「左端点」排序了,因此两个区间重叠的时候,我们应该移除「右端点较大」的区间,
Java算法代码:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
//1.按照左端点排序
Arrays.sort(intervals, (v1, v2) ->{
return v1[0] - v2[0];
});
//2.移除区间
int ret = 0;
int left = intervals[0][0], right = intervals[0][1];
for(int i = 1; i < intervals.length; i++){
int a = intervals[i][0], b = intervals[i][1];
if( a < right){ //有重叠区间
ret ++;
right = Math.min(right, b); //贪心:删除右端点较大的区间
}else{ //没有重叠区间
right = b;
}
}
return ret;
}
}
执行结果:
贪心策略: