每天一题LeetCode【第40天】
2017-04-07 本文已影响190人
草稿纸反面
T56. Merge Intervals【Medium】
题目
给一个区间集,合并有重叠的区间。
例如:
给出区间 [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
思路
哈其实,一开始我有我看到合并区间懵了一下(英文还是不行啊!)
所以上图解释一下哈哈:
然后再讲思路:
① 若区间为0~1个,直接返回
② 给区间按 start 元素排序
③ 若重合( next.start<this.end )取两个 end 元素得较大值
④ 若不重合,则这个区间不能再合并了,添加到 result 里面
代码
代码取自 Top Solution,稍作注释
static List<Interval> merge(List<Interval> intervals) {
//若区间为0~1个,直接返回
if (intervals.size() <= 1)
return intervals;
//按 start 元素排序
intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));
List<Interval> result = new LinkedList<Interval>();
// 给初始 start end 赋值
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for (Interval interval : intervals) {
if (interval.start <= end)
// 重叠时,对end进行处理
end = Math.max(end, interval.end);
else {
// 添加上一个分好的区间,并重置边界
result.add(new Interval(start, end));
start = interval.start;
end = interval.end;
}
}
// 添加最后一个 Interval
result.add(new Interval(start, end));
return result;
}
补充
看到这个东西一脸懵逼(内心:java怎么会有箭头啊!):
intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));
好吧,我还是太年轻,这是 Java SE 8 的 Lambda 表达式。
给几个博客链接:
但是最重要的还是自己写代码试试~咳,不说了,写代码去。