区间完全覆盖问题
问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖。
思路:
将区间按照起始坐标排序。(起始坐标相同,就按结尾坐标排序)
然后维护两个变量,last表示当前已经覆盖到的区域的最右端。far表示在所有剩下的线段之中,所有左端点小于等于last,并且其右端点能延伸的最短距离。
class Solution {
public int minCover(int[][] intervals, int total) {
if (intervals == null || intervals.length == 0) {
return 0;
}
Arrays.sort(intervals, (a, b) -> (a[0] == b[0]? a[1] - b[1]: a[0] - b[0]));
int count = 0;
int cover = 0;
int last = 0;
int start = intervals[0][0];
for (int i = 0; i<intervals.length; i++) {
if (i< intervals.length - 1 && intervals[i+1][0] <= last) { //最远的<= last的,就是我们要添加进去的那个区间
continue;
}
last = intervals[i][1]; //update last
count++;
cover = last - start;
if (cover >= total) {
return count;
}
}
return -1;
}
}

浙公网安备 33010602011771号