牛客Top200---合并区间 (java图解超详细)

题目

在这里插入图片描述

解析

可以先看一幅图来直观的感受整个合并过程
在这里插入图片描述
整个合并过程如下:
对于两个区间[a,b] [c,d]
1、若 a < c < b,则这两个区间可合并,此时若b>d,则合并后的区间为[a,b],反之为[a,d]
2、若 c > b, 则不能合并
如红色框就可以合并成[a,d],这也是合并的第一种情况 a<c<b<d => [a,d]
还有一种情况, 如第二幅图,a<c<d<b => [a,b]
合并后的区间 [left,right], left必须是当前最小的,right必须为当前最大的

在这里插入图片描述

在这里插入图片描述

如果每个子区间(Interval)都有start和end, 那么就要用第一个end和第二个start比较,然后更新start和end,使其变成局部最小与最大

执行过程如下
(1) 首先要对每个子区间(Interval)按照开始元素排序,子区间是一个Interval对象, Interval对象记录区间start和end,所以可以用lambda表达式进行排序
Collections.sort(intevals,(x,y)->x.start-y.start),这里他就会取每个子区间的start进行相减,然后比出大小排出顺序,关于lambda表达式不太会的,参考文章 一文看懂 Java8 的 Lambda表达式,写的不错,lambda就是匿名类演化过来的,表达更为简洁,非常有必要学习
(2) 合并过程
在这里插入图片描述

在这里插入图片描述

代码

理解过程,那么代码就好写了

import java.util.*;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<>();//定义返回的结果集
        int len = intervals.size();//子区间个数
        //判空
        if(len == 0){
            return res;
        }
        //非空,先排序
        Collections.sort(intervals,(x,y) -> x.start - y.start);
        for(int i = 1 ; i < len ; i++){
            //可以合并,更新start和end
            if(intervals.get(i).start <= intervals.get(i-1).end){
                intervals.get(i).start = Math.min(intervals.get(i-1).start,intervals.get(i).start);
                intervals.get(i).end = Math.max(intervals.get(i-1).end,intervals.get(i).end);
            }else{
                //不能合并,则返回
                res.add(intervals.get(i-1));
            }
        }
        //添加最后一个
        res.add(intervals.get(len-1));
        return res;
    }
}

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小样x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值