1288. 删除被覆盖区间

算法记录

LeetCode 题目:

  给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。在完成所有删除操作后,请你返回列表中剩余区间的数目。



说明

一、题目

  输入:intervals = [[1,4],[3,6],[2,8]]
  输出:2
  解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。

二、分析

  • 对区间进行排序之后可以得到一个相对有序的区间数组。
  • 这时候的区间相交只需要判断后一个区间的终止是不是在于前一个区间的终止之前就可以判断是否区间覆盖了。
  • 但是有一个问题,有可能两个区间的起点相同,但是前一个的区间在后一个的范围内,这样判断就无法拿到正确的结果,也就需要我们的排序区间是先对起点进行排序,如果相同则再进行终点排序,保证每次都是用前一个区间去覆盖后一个区间。
class Solution {
    
    
    public int removeCoveredIntervals(int[][] intervals) {
    
    
        int ans = intervals.length;
        Arrays.sort(intervals, new Comparator<int[]>() {
    
    
            @Override
            public int compare(int[] o1, int[] o2) {
    
    
                if(o1[0] == o2[0]) return o2[1] - o1[1];
                else return o1[0] - o2[0];
            }
        });
        for(int i = 0; i < intervals.length; i++) {
    
    
            int j = i + 1;
            while(j < intervals.length && intervals[j][1] <= intervals[i][1]) {
    
    
                ans--;
                j++;
            }
            i = j - 1;
        }           
        return ans;
    }
}

总结

逻辑问题,将情况考虑完即可。

Guess you like

Origin blog.csdn.net/MTYSYS19990212/article/details/120546311