本文已参与「新人创作礼」活动,一起开启掘金创作之路
435. 无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意: 可以认为区间的终点总是大于它的起点。 区间 [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
- 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
思路很抽象。我也是看了评论区的那个参考为时间的方案,如果上个事件未结束,新的事件就不能开始。
package com.programmercarl.greed;
import com.programmercarl.util.GenerateArray;
import java.util.Arrays;
/**
* @ClassName EraseOverlapIntervals
* @Descriotion TODO
* @Author nitaotao
* @Date 2022/7/17 6:47
* @Version 1.0
* https://leetcode.cn/problems/non-overlapping-intervals/
* 435. 无重叠区间
**/
public class EraseOverlapIntervals {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals,(o1,o2)->{
//以第二列升序,第一列降序
if (o1[1] == o2[1]) {
return Integer.compare(o2[0], o1[0]);
} else {
return Integer.compare(o1[1], o2[1]);
}
});
int end = intervals[0][1];
int result = 0;
for (int i = 1; i < intervals.length; i++) {
//如果当前起点>end,说明上个end已结束
if (intervals[i][0] >= end) {
end = intervals[i][1];
} else {
//否则上个end没结束,就不能开始,这个就得删除
result++;
}
}
return result;
}
public static void main(String[] args) {
int[][] arr = (int[][]) GenerateArray.generateArrays("[[-52,31],[-73,-26],[82,97],[-65,-11],[-62,-49],[95,99],[58,95],[-31,49],[66,98],[-63,2],[30,47],[-40,-26]]", "int");
System.out.println(new EraseOverlapIntervals().eraseOverlapIntervals(arr));
}
}