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

题目

牛客Top200---合并区间 (java图解超详细)_第1张图片

解析

可以先看一幅图来直观的感受整个合并过程
牛客Top200---合并区间 (java图解超详细)_第2张图片
整个合并过程如下:
对于两个区间[a,b] [c,d]
1、若 a < c < b,则这两个区间可合并,此时若b>d,则合并后的区间为[a,b],反之为[a,d]
2、若 c > b, 则不能合并
如红色框就可以合并成[a,d],这也是合并的第一种情况 a [a,d]
还有一种情况, 如第二幅图,a [a,b]
合并后的区间 [left,right], left必须是当前最小的,right必须为当前最大的

牛客Top200---合并区间 (java图解超详细)_第3张图片

牛客Top200---合并区间 (java图解超详细)_第4张图片

如果每个子区间(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) 合并过程
牛客Top200---合并区间 (java图解超详细)_第5张图片

牛客Top200---合并区间 (java图解超详细)_第6张图片

代码

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

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;
    }
}

牛客Top200---合并区间 (java图解超详细)_第7张图片

你可能感兴趣的:(牛客高频Top200,java,算法)