X

LEETCODE 1288. Remove Covered Intervals 解题思路分析

题目大意:

删除被覆盖区间

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

只有当 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]

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1288

解题思路分析:

我们需要先对数组进行排序,排序时,按照每个区间的开始位置进行升序排序。然后循环所有区间,当前区间的开始位置一定小于等于其右方所有区间的开始位置,接下来,只要在其右方找到结束位置小于等于当前结束位置的区间,该区间一定是被当前区间包围的,因此该区间可以被删除。为了避免重复删除,区间被删除后,将其结束区间更改为无限大即可。当接下来的循环中,遇到结束区间无限大时可以直接跳过。

实现代码:

public int removeCoveredIntervals(int[][] intervals) {
    // 按照区间开始位置进行升序排列
    Arrays.sort(intervals,(x,y)->x[0]-y[0]);
    // 返回结果默认为区间总个数
    int res=intervals.length;
    // 循环每个区间
    for(int i=0;i<intervals.length;i++){
        // 如果当前区间结束位置为100001(本题的最大值),跳过
        if(intervals[i][1]==100001) continue;
        // 循环当前区间右方的所有区间
        for(int j=i+1;j<intervals.length;j++){
            // 如果当前区间结束位置大于等于该区间结束位置
            if(intervals[i][1]>=intervals[j][1]){
                // 删除该区间(结果减一)
                res--;
                // 为了避免重复删除,将该区间结束区间更新为一个最大值
                intervals[j][1]=100001;
            }
        }
    }
    return res;
}

本题解法执行时间为6ms。

Runtime: 6 ms, faster than 70.27% of Java online submissions for Remove Covered Intervals.

Memory Usage: 39.4 MB, less than 100.00% of Java online submissions for Remove Covered Intervals.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1288-remove-covered-intervals-解题思路分析/
Categories: leetcode
Tags: javaleetcode
kwantong: