无重叠区间------2023/02/13

题目描述

无重叠区间

解题思路

只做简单的判断:一个个区间进行判断,模拟最大区间,如果新加入的区间存在超过当前最大区间的范围,则进行更新,否则计数。
反思:没仔细阅读题目,题目说的意思不是得到最大区间,而是争取保留更多的区间数。

正确代码的思路:使得保留的区间覆盖范围越小,这样可以容忍的区间就越大。这里使用的是贪心算法。按照起点进行排序,如果新加入的区间起点大于当前区间的终点,则加入并计数,否则判断新加入区间的终点与当前区间的终点哪个更小。满足容纳更多区间与互不重叠的原则。

代码实现

错误代码一

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int res=0;
        int len=intervals.length;
        if(len==1) return 0;

        int [] temp=new int[2];
        temp[0]=intervals[0][0];
        temp[1]=intervals[0][1];
        for(int i=1;i<len;i++){
            if(intervals[i][0]<temp[0]){
                temp[0]=intervals[i][0];
            }
            else{
                if(intervals[i][1]>temp[1]){
                    temp[1]=intervals[i][1];
                }
                else{
                    res++;
                }
            }

        }
        return res;

    }
}

正确代码实现

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int size=0;
        int len=intervals.length;
        if(len==1) return 0;
        // 根据区间的开头进行排序,
    	Arrays.sort(intervals,(a,b)->a[0]-b[0]);
        int right=Integer.MIN_VALUE;
        for(int i=0;i<len;i++){
            if(intervals[i][0]>=right){
                right=intervals[i][1];
                size++;
            }
            else{
                if(intervals[i][1]<right){
                    right=intervals[i][1];
                }
            }

        }
        int res=len-size;
        return res;

    }
}

问题记录

在这里插入图片描述
非常奇怪,没想清楚为啥移除的是两个,而不是三个。。。

心得:困难像弹簧,,,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值