【刷题日记】最大不重叠区间的数量 leetcode 435

题目描述

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

求解思路

本题应该使用贪心算法,也就是当出现区间重叠的情况下,使用贪心的思路,选取右区间更加靠前的一个,可以保证和剩余的区间重叠的概率最低,这样考虑下来不重叠的部分就最大

因此第一步是对区间进行排序,排序规则使用一维数组的右边界进行排序,从左向右的方式遍历

  • 第一组和遍历过程中的元组没有交集的情况下,统计不重叠区间的最大值
  • 使用全部元组的数量减去不重叠区间元组的数量, 就可以得到最小需要移除的元组了

解决代码

public int eraseOverlapIntervals(int[][] intervals) {
        //定义排序比较器
        if (intervals == null) {
            return 0;
        }
        //统计不重叠的区间个数
        int notOverlapNum = 1;
        Arrays.sort(intervals, Comparator.comparingInt(o -> o[1]));
        int rightEdge = intervals[0][1];
        for(int k= 1; k< intervals.length; k++) {
            if (intervals[k][0] >= rightEdge) {
                rightEdge = intervals[k][1];
                notOverlapNum++;
            }
        }
        return intervals.length - notOverlapNum;
    }

题目总结

  • 本题需要注意解决多维二元组的重叠或者不重叠问题时,首先通过自定义比较器实现排序,之后根据排序的数组进行统计和判断
  • 第二点在于贪心算法的运用,本题就是一个合适的场景:当出现区间重叠的时候,一定会减少我们结果集的个数,但是向潜在损失小的方向考虑,就能最优的实现留存最大的结果。我们本题不考虑具体删除的区间,只统计删除的个数,因此使用贪心算法能满足要求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值