LeetCode 1288:删除被覆盖的区间

导读:本篇文章讲解 LeetCode 1288:删除被覆盖的区间,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

链接
题目
在这里插入图片描述

思路:排序+双指针

  1. 先排序,对 L 正序排序,如果L相等,再按照 R 倒着排序,这样保证当L相等时,R大的在前面作为基准,R小的在后面判断是否背覆盖;

  2. 设第 i 个基准区间的 右端点为 x_R,第 i+1 个区间的右端点为 c_R
    排完序后共三种情况:

    ① i 覆盖 i+1:即 c_R <= x_R,则 i+1 要被删除,用count 记录;
    ②i 和 i+1 重叠:不需要删除,但是更新 基准 x_R 为i+1的右端点;
    ③i 和 i+1 隔开:不需要删除,但是更新 基准 x_R 为i+1的右端点;

注意:当 c_R = x_R 也是i+1被 i 覆盖,也要删除

Java实现:

class Solution {
    public int removeCoveredIntervals(int[][] intervals) {
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[]a ,int[] b){
                // L 相同则按照R 倒着排
                if(a[0]==b[0]){
                    return b[1]-a[1];
                }
                return a[0]-b[0];
            }
        });
    // 不需要选最大,用for
    int n=intervals.length;
    int count=0; // 要被删除的
    // 基准
    int x_R=intervals[0][1];
    for(int i=1;i<n;i++){
        int c_R=intervals[i][1];
        if(c_R <= x_R){ // 覆盖
            count++; 
            continue;
        }else{ //重叠 or 分隔-----更新 x_R
            x_R=intervals[i][1];
        }
    }
    return n-count;
    }
}   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89172.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!