给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return 0;
}
Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 按照左边界进行排序
int count = 0; // 记录需要移除的区间数量
int end = intervals[0][1]; // 记录当前区间的结束位置
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < end) { // 如果当前区间和前一个区间重叠了
count++; // 需要移除一个区间
end = Math.min(end, intervals[i][1]); // 移除结束位置比较靠后的那个区间
} else {
end = intervals[i][1]; // 更新当前区间的结束位置
}
}
return count;
}
}
贪心算法,找最好的右边界。
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
Arrays.sort(points, (a, b) -> a[0] > b[0] ? 1 : -1);
long end = points[0][1];
int ans = 1;
for(int i = 1; i < n; i++) {
if(end >= points[i][0]) {
// 记得更新最小右区间
end = Math.min(points[i][1], end);
continue;
}else {
end = points[i][1];
ans++;
}
}
return ans;
}
}