题目描述
解法
一定要按照开始时间升序排
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Comparator;
/**
* 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> result = new ArrayList<>();
if(intervals==null || intervals.size()==0) return result;
//按照开始时间上 升排序先,开始时间相同则按照结束时间降序
Interval[] intervalS = new Interval[intervals.size()];
for(int i=0;i<intervalS.length;i++){
intervalS[i] = intervals.get(i);
}
Arrays.sort(intervalS,new Comparator<Interval>(){
public int compare(Interval o1,Interval o2){
if(o1.start>o2.start){
//小的排前面
return 1;
}
return -1;
}
});
//获取第一个活动作为前一个重叠区间
int pre = 0;
int end0 = intervalS[0].end;
int start0 = intervalS[0].start;
for(int i=1;i<intervals.size();i++){
int end = intervalS[i].end;
int start = intervalS[i].start;
if(end0<start){
//没有重叠,直接添加
result.add(intervalS[pre]);
//更新pre
end0 = end;
start0 = start;
pre = i;
}else{
//end0>=start end0<end
//重叠,先合并成为大的,开始时间合并
start0 = start>start0?start0:start;//保证最小
end0 = end>end0?end:end0;//保证最大,如果是降序排end则不需要了,直接=end
intervalS[i].start = start0;
intervalS[i].end = end0;
pre = i;
//result.add(intervalS[pre]);
}
}
if(pre<intervals.size()){
//最后一个如果没有重复则还没有添加。如果重复则pre = size-1。
result.add(intervalS[pre]);
}
return result;
}
}