LeetCode 1288.删除被覆盖区间:排序(非二重循环暴力)

【LetMeFly】1288.删除被覆盖区间:排序(非二重循环暴力)

力扣题目链接:https://leetcode.cn/problems/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]

解题方法一:二重循环暴力

由于数据量最大只有 1000 1000 1000,所以可以二重循环一一对比,查看某个区间是否被包含在其他区间中。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n = l e n ( i n t e r v a l s ) n=len(intervals) n=len(intervals)
  • 空间复杂度 O ( 1 ) O(1) O(1)

解题方法二:排序(贪心)

按照其实时间从小到大排序,那么按顺序遍历的过程中,后遍历的区间起始时间一定比先遍历区间的晚。那么如果前面有区间的截止时间在此区间之后,是不是说明这个区间一定被覆盖掉了。

所以排序依据:若起始时间不同则起始时间小的优先,否则截止时间大的优先。

  • 时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度 O ( log ⁡ n ) O(\log n) O(logn)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-07-07 22:16:53
 */
class Solution {
public:
    int removeCoveredIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0];
        });
        int ans = intervals.size();
        for (int i = 0, n = intervals.size(), r = 0; i < n; i++) {
            ans -= intervals[i][1] <= r;
            r = max(r, intervals[i][1]);
        }
        return ans;
    }
};
Python
python 复制代码
'''
LastEditTime: 2026-07-07 22:19:44
'''
from typing import List

class Solution:
    def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: (x[0], -x[1]))
        ans = len(intervals)
        R = 0
        for l, r in intervals:
            ans -= r <= R
            R = max(R, r)
        return ans
Java
java 复制代码
/*
 * @LastEditTime: 2026-07-07 22:31:39
 */
import java.util.Arrays;

class Solution {
    public int removeCoveredIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
        });
        int ans = intervals.length;
        int r = 0;
        for (int[] v : intervals) {
            if (v[1] <= r) {
                ans--;
            } else {
                r = v[1];
            }
        }
        return ans;
    }
}
Go
go 复制代码
/*
 * @LastEditTime: 2026-07-07 22:28:57
 */
package main

import "sort"

func removeCoveredIntervals(intervals [][]int) int {
    sort.Slice(intervals, func(i, j int) bool {
        if intervals[i][0] == intervals[j][0] {
            return intervals[i][1] > intervals[j][1]
        }
        return intervals[i][0] < intervals[j][0]
    })
    
    ans := len(intervals)
    r := 0
    for _, v := range intervals {
        if v[1] <= r {
            ans -= 1
        }
        r = max(r, v[1])
    }
    return ans
}
Rust
rust 复制代码
/*
 * @LastEditTime: 2026-07-07 22:36:22
 */
impl Solution {
    pub fn remove_covered_intervals(mut intervals: Vec<Vec<i32>>) -> i32 {
        intervals.sort_by_key(|x| (x[0], -x[1]));
        let mut ans = intervals.len() as i32;
        let mut r = 0;
        for v in intervals.iter() {
            if v[1] <= r {
                ans -= 1;
            } else {
                r = v[1];
            }
        }
        return ans;
    }
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
lvwangshu5 小时前
CF1882D Tree XOR 题解
动态规划·题解·贪心·dp·树形dp·换根dp·性质题·思维好题·推导题
罗湖老棍子5 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
文丑颜不良啊5 小时前
LeetCode201~225题目解析
java·leetcode
stsdddd7 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码8 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n8 小时前
【算法】约瑟夫环问题
java·算法
l1t9 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil2089 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE9 小时前
10.18【A】
算法
LMT流氓兔9 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain