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

Posted 小样5411

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客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进行相减,然后比出大小排出顺序

代码

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

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图解超详细)的主要内容,如果未能解决你的问题,请参考以下文章

牛客Top200---判断一个链表是否为回文结构(java图解)

牛客Top200---合并k个有序链表(java)

牛客Top200刷题(java)

牛客Top200---合并两个有序数组

牛客Top200---括号序列(java详解)

牛客Top200---反转字符串(java)