区间完全覆盖问题

问题描述:给定一个长度为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;
    }
}
posted @ 2020-05-20 05:08  EvanMeetTheWorld  阅读(63)  评论(0)    收藏  举报