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

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

力扣题目链接:https://leetcode.cn/problems/remove-covered-intervals/

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

只有当 c <= ab <= 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 != jintervals[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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
阿文的代码库1 小时前
经典算法题剖析:按奇偶排序数组
数据结构·算法
AI小码1 小时前
WAIC 2026前瞻:AI产业进入拼落地的下半场
人工智能·算法·ai·程序员·大模型·编程·智能体
珠海西格电力2 小时前
零碳园区数据应用的具体场景有哪些?
大数据·人工智能·算法·架构·能源
geovindu3 小时前
CSharp: Dijkstra Algorithms
开发语言·后端·算法·c#
学逆向的3 小时前
汇编——位运算
开发语言·汇编·算法·网络安全
可编程芯片开发3 小时前
基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器
算法
学究天人3 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷2)
算法·数学建模·动态规划·图论·抽象代数·拓扑学
玛卡巴卡ldf4 小时前
【LeetCode 手撕算法】(细节知识点总结)
java·数据结构·算法·leetcode·力扣
wanzehongsheng4 小时前
零碳产业园光伏园区光伏电站追踪对比固定:发电增益技术边界分析
算法·光伏发电·光伏·零碳园区·太阳能追光·低碳环保·追踪电站