给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-overlapping-intervals
这一题刚上手没有解题思路,感觉可以贪心算法一下,但是无从下手。看了大神的题解,恍然大悟,需要先进行排序,将所有区间按后区间进行排序。以首区间为始,遍历所有区间,只要遍历区间的前区间小于选择后区间的后区间,就去掉,否则将该区间的后区间作为选择后区间。
代码如下
package com.test;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class MyTest {
public static void main(String[] args) {
int[][] inte = {{1,2},{2,3},{3,4},{1,3}};
System.out.println(eraseOverlapIntervals(inte));
}
public static int eraseOverlapIntervals(int[][] intervals){
if(intervals.length <= 1){
return 0;
}
// 按 end 升序排序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return a[1] - b[1];
}
});
int x_end = intervals[0][1];
int count =0;
for(int i = 1 ;i<intervals.length ; i++){
if(intervals[i][0] < x_end){
count++;
}else {
x_end = intervals[i][1];
}
}
return count;
}
}