关于力扣三大区间问题(合并、重叠、插入)

56. 合并区间icon-default.png?t=LA92https://leetcode-cn.com/problems/merge-intervals/

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

 思想过程:

  • 先把所有区间按照左排序,然后比较结果数组里的当前区间的右边界,和排序数组的右边界,取最大值;
  • 当不满足合并条件或者数组为空的时候,就直接加入结果数组里;
  • 另外还学到了对于区间进行排序的lambada表达式,
  • Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);

    Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]); 假设传来两个值,v1 与 v2,那么他们的先后顺序以 v1[0] 比 v2[0] 的结果为准,即:若 v1[0] < v2[0] 则 v1 < v2,若 = 则 =,若 > 则 >

    举一反三:Arrays.sort(intervals, (v1, v2) -> v1[0] == v2[0] ? v2[1] - v1[1] : v1[0] - v2[0]); 表示:传来两个值 v1 与 v2,若 [0] 相同,则按 [1] 降序;若不同则按 [0] 升序。

class Solution {
    public int[][] merge(int[][] intervals) {       
        if(intervals.length<=1)
            return intervals;       
        Arrays.sort(intervals,new Comparator<int[]>(){
            @Override
            public int compare(int[]o1,int[]o2){
                //[]里面写0,就是按照第一位排序
                return o1[0]-o2[0];
            }
        });
        int index=-1;//记录答案区间个数
        int[][] ans = new int[intervals.length][2];
        for(int i=0;i<intervals.length;i++){
            //数组为空,或者不满足合并条件,就直接加入结果数组
            if(index==-1||intervals[i][0] > ans[index][1]){
                index++;  
                ans[index][0] = intervals[i][0];
                ans[index][1] = intervals[i][1];             
            }else{
                ans[index][1] = Math.max(intervals[i][1],ans[index][1]);
            }
        }
        return Arrays.copyOf(ans, index + 1);

    }
}

 


435. 无重叠区间

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

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

输出: 1

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

思想过程:

  • 这个跟合并不一样,是进行右排序,按数组的右边界排序,依次比较相邻数组的左边界值和右边界值大小,想左<右,则数量+1;
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,new Comparator<int[]>(){
            @Override
            public int compare(int[]o1,int[]o2){
                return o1[1]-o2[1];
            }
        });
        int count=1;//第一个区间默认保留了
        int pre = intervals[0][1];
        for(int i=1 ; i<intervals.length;i++){
            if(intervals[i][0] >=pre){
                count++;
                pre = intervals[i][1];
            }
        }
        return intervals.length-count;
    }
}

 


插入区间还没碰到,到时候再写了

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值