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