LeetCode 第56题 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
不知道为何使用lamada表达式会慢很多?
0 1 2 3
[1,3] , [2,6] , [8,10] , [15,18]
先按start排序
从pos: 1 开始,判断前一个的end是否比自己的start要大或等 3 >=2 ?
: 如果为true,则说明两个区间可以合并,更新temp.end的值
不过虽然前一个end比自己的start要大,也有可能出现 [1,3] [2,2] 的情况
因此.temp.end的值应该选两个end值中大的那个(temp.end , end )
: 如果为false,则说并两个区间不能合并,将temp加入到res中,重新赋值temp
循环结束后,最后的temp没有被加入到res中,加入
return
1 class Solution56 {
2
3 public List<Interval> merge(List<Interval> intervals) {
4 if (intervals == null || intervals.size() <= 1) {
5 return intervals;
6 }
7 intervals.sort(new Comparator<Interval>() {
8 @Override
9 public int compare(Interval o1, Interval o2) {
10 return o1.start - o2.start;
11 }
12 });
13 List<Interval> res = new LinkedList<>();
14 Interval temp = intervals.get(0);
15 for (int i = 1; i < intervals.size(); i++) {
16 int start = intervals.get(i).start;
17 int end = intervals.get(i).end;
18 if (temp.end >= start) {
19 temp.end = Math.max(end, temp.end);
20 } else {
21 res.add(temp);
22 temp = intervals.get(i);
23 }
24 }
25 res.add(temp);
26 return res;
27 }
28 }