算法练习:删除被覆盖区间

**

题目描述:

**
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

在完成所有删除操作后,请你返回列表中剩余区间的数目。

示例:

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

提示:​​​​​​

1 <= intervals.length <= 1000
0 <= intervals[i][0] < intervals[i][1]<= 10^5
对于所有的 i != j:intervals[i] != intervals[j]

**

解题思路:

**

  1. 获得区间端点
  2. 将各个区间按照左端点进行升序排列,如果左端点相同的话按照右端点降序排列
    原来的区间图:
    在这里插入图片描述
    排序之后的区间图:
    在这里插入图片描述

3.根据排序之后的区间,保证后一个区间如果右端点较大,那么它一定不被在他之前的区间包含,以此比较右端点,若下一个区间的右端点比较小,则其被包含,若不小,则不被包含,且当前右端点记录值更换

扫描二维码关注公众号,回复: 10753475 查看本文章

**

解题代码:

**

 public static int removeCoveredIntervals(int[][] intervals) {
//        定义排序方式:按照左区间升序排列,如果左区间相同,按照右区间降序
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]==o2[0] ? o2[1]-o1[1] : o1[0]-o2[0];
            }
        });
//        记录区间数
        int count = 0;
//        记录右区间最大点
        int max_right = 0;
        for(int[] interval : intervals){
            if(max_right<interval[1]){
                count++;
                max_right = interval[1];
            }
        }

        return count;
    }

**

个人收获:

**
看到这个题之后总觉得不会很难,确实,如果不将其进行排序,遍历数组,判断当前区间是否被包含,就能确定最后剩余的区间数,但是将其进行了排序之后时间复杂度为:O(NlogN)O(NlogN),
空间复杂度为:O(1)。既节省时间又节省空间的解决问题,这才是努力学习算法的目的

发布了71 篇原创文章 · 获赞 14 · 访问量 5611

猜你喜欢

转载自blog.csdn.net/flying_hengfei/article/details/105398697