435. 无重叠区间

贪心

解题思路

  1. 本题和 leetcode🧑‍💻 452. 用最少数量的箭引爆气球 的思路相同;

  2. 弓箭的数量就相当于是非交叉区间的数量,移除的区间数量 = 总区间数 - 弓箭数量

  3. 这里要注意:边界相邻不算重合;

图解

复杂度

  1. 时间复杂度:O(nlogn),其中 n 是数组 intervals 的长度,排序的时间复杂度为 O(nlogn),对所有气球进行遍历并计算答案的时间复杂度为 O(n)

  2. 空间复杂度:O(logn),即为排序需要使用的栈空间;

代码实现

var eraseOverlapIntervals = function (intervals) {
    let arrows = 1; // 初始化箭头数量

    // 1. 对气球的起始位置进行排序
    intervals.sort((a, b) => a[0] - b[0]);

    // 2. 对比气球在 x 轴方向是否有重叠
    for (let i = 1; i < intervals.length; i++) {
        if (intervals[i][0] >= intervals[i - 1][1]) {
            // 2-1. 与上一个气球没有重叠
            arrows++;
        } else {
            // 2-2. 与上一个气球重叠,并更新当前气球的右边界(更新右边界的原因:有可能存在 2 个以上的气球重叠)
            intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]);
        }
    }

    return intervals.length - arrows;
};

参考资料

  1. 卡尔:《代码随想录》

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 贪心
    1. 1.1. 解题思路
    2. 1.2. 图解
    3. 1.3. 复杂度
    4. 1.4. 代码实现
  2. 2. 参考资料