435. 无重叠区间 - 力扣(LeetCode)

题目描述

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

题目示例

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]

输出: 1

解释: 移除 [1,3] 后,剩下的区间没有重叠。

解题思路

将数组按照左边界或者右边界从小到大排序,目的是为了将容易重叠的区间放在一块,本题解采用左边界排序。采取以下贪心策略:

  • 如果当前左边界大于等于上个右边界,表示两个区间无重叠,此时不需要做任何操作,因为我们是要去除重叠部分。
  • 否则,表示两个区间有重叠,此时 result++,因为至少需要移除一个才可以保证无重叠。然后需要将当前右边界修改成与上个右边界的最小值,目的是为了下次判断有无重叠。如果下次判断无重叠的话,就执行上个逻辑不需要任何操作,只需要去除一个重叠部分就可以了;如果下次有重叠执行这个逻辑,则需要去除两个重叠部分,然后再更新最小右边界,继续判断重叠部分。

参考代码

java 复制代码
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        
        Arrays.sort(intervals, (a, b) -> {
            return Integer.compare(a[0], b[0]);
        });

        int ans = 0;
        for(int i = 1; i < intervals.length; i++) {
            // 当前左边界大于等于上个右边界,表示两个区间不重叠
            if(intervals[i][0] >= intervals[i-1][1]) {
            } else {
                // 两个区间重叠
                ans++;
                // 更新右边界最小值
                intervals[i][1] = Math.min(intervals[i][1], intervals[i-1][1]);
            }
        }

        return ans;
    }
}
相关推荐
浮芷.12 分钟前
微观搜打撤:基于鸿蒙flutter的内存快照算法的局内外状态隔离与高阶背包系统设计
算法·flutter·华为·开源·harmonyos·鸿蒙
郝学胜-神的一滴13 分钟前
[力扣 105]二叉树前中后序遍历精讲:原理、实现与二叉树还原
数据结构·c++·算法·leetcode·职场和发展
sheeta199816 分钟前
LeetCode 每日一题笔记 日期:2026.04.20 题目:2078.两栋颜色不同而距离最远的房子
笔记·算法·leetcode
闻缺陷则喜何志丹20 分钟前
【ST表 前缀和】P7809 [JRKSJ R2] 01 序列|普及+
c++·算法·前缀和·洛谷·st表
X journey24 分钟前
机器学习实践(18.5):特征工程补充
人工智能·算法·机器学习
LG.YDX38 分钟前
笔试训练48天:mari和shiny(动态规划 - 线性dp)
数据结构·算法
m0_5648768439 分钟前
提示词应用
深度学习·学习·算法
qq_2837200541 分钟前
Transformer 高频面试题及答案
算法·面试·transformer
承渊政道41 分钟前
【递归、搜索与回溯算法】(floodfill算法:从不会做矩阵题,到真正掌握搜索扩散思想)
数据结构·c++·算法·leetcode·矩阵·dfs·bfs
_小草鱼_42 分钟前
【数据结构】链表
数据结构·链表·数组·单链表·双链表