给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例 1:
1 2 3
| 输入: intervals = 输出: 1 解释: 移除 后,剩下的区间没有重叠。
|
示例 2:
1 2 3
| 输入: intervals = 输出: 2 解释: 你需要移除两个 来使剩下的区间没有重叠。
|
示例 3:
1 2 3
| 输入: intervals = 输出: 0 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
|
提示:
1 <= intervals.length <= 105
intervals[i].length == 2
-5 * 104 <= starti < endi <= 5 * 104
同上一题
先按照左区间从小到大排序
交叉的区间保留右边的最小值
最后用总区间长度减去合并后的区间长度就是要移除的区间长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> a[0] - b[0]); List<int[]> list = new ArrayList<>(); list.add(new int[] {intervals[0][0], intervals[0][1]}); for(int i = 1; i < intervals.length; i++){ if(intervals[i][0] >= list.get(list.size()-1)[1]){ list.add(new int[] {intervals[i][0], intervals[i][1]}); }else{ list.get(list.size()-1)[1] = Math.min(list.get(list.size()-1)[1], intervals[i][1]); } } return intervals.length - list.size(); } }
|
区间不合并的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int eraseOverlapIntervals(int[][] intervals) { Arrays.sort(intervals, (a,b) -> a[0] - b[0]); int count = 1; for(int i = 1; i < intervals.length; i++){ if(intervals[i][0] >= intervals[i-1][1]){ count ++; }else{ intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]); } } return intervals.length - count; } }
|