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 }

 

posted @ 2019-02-13 14:58  散装英语king  阅读(206)  评论(0编辑  收藏  举报