LeetCode/435. 无重叠区间

435. 无重叠区间

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:

1
2
3
4
5
输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

1
2
3
4
5
输入: [ [1,2], [1,2], [1,2] ]

输出: 2

解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

1
2
3
4
5
输入: [ [1,2], [2,3] ]

输出: 0

解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

本题基于贪心的思想,一说到贪心,要通过去除最小个数的区间来使剩下的区间互相不重叠,首先就要想到要对数组进行排序。本题中我们按照每个区间起点由小到大的顺序排列,接着我们思考怎么才能满足去除尽可能少的区间使得剩下的区间满足条件。这里就需要比较区间的终点,很容易想到,我们要尽可能地保留终点小的区间而去除终点大的区间,因为这样才能给后续的区间留有尽可能多的空间,保留更多的区间段。举个例子,给定区间集合[[1, 2], [1, 3], [2, 3]],如果第一次去除了[1, 2],那么剩下的[1, 3][2, 3]中还要去除一个才能满足条件,如果保留了[1, 2],去除[1, 3],那我们就可以留下两个空间。

具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals.length == 0)
return 0;
int result = 0;

Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);

//临时变量,用于保留当前最小的终点
int temp = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (temp > intervals[i][0]) {
temp = Math.min(temp, intervals[i][1]);
result++;
} else {
temp = intervals[i][1];
}
}

return result;
}
}

Comments