Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
题目略难(对我来说),于是又惨参考答案:
思路是,首先因为输入的List不一定是有序的,那就先对其进行排序,我才知道原来Java的List本来是可以用Comparator方法直接排序的,格式是:
public class Developer {
String name;
BigDecimal salary;
int age;
}
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer developer, Developer compareDeveloper) {
return developer.getName().compareTo(compareDeveloper.getName());
}
};
就是Comparator决定了排序依据。对应的 Lambda 表达式示例:
Comparator<Developer> byNameLambda =
(Developer developer, Developer compareDeveloper)->developer.getName().compareTo(compareDeveloper.getName());
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
不得不感叹:语言真是与时俱进,按需求而改啊!!
回到题目,首先对List进行排序(依照start的值),用start,end保存当前区间,然后依次向后进行比较:如果下一个的start小于当前区间的end ,就合并区间;否则加入当前区间,更新参数值。
注意循环结束后还要加入最后的一个区间。
class Solution {
public List<Interval> merge(List<Interval> intervals) {
if(intervals.size()<=1)
return intervals;
List<Interval> res = new ArrayList<Interval>();
intervals.sort((i1,i2)->Integer.compare(i1.start,i2.start));
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for(Interval interval:intervals){
if(interval.start<=end)
end=Math.max(end,interval.end);
else{
res.add(new Interval(start,end));
start = interval.start;
end = interval.end;
}
}
res.add(new Interval(start,end));
return res;
}
}