给出若干闭合区间,合并所有重叠的部分。
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
挑战
View Code
O(n log n) 的时间和 O(1) 的额外空间。
解题思路:这道题在最开始看的时候误以为是已经排好序的,结果直接就分情况讨论了,当然程序是妥妥没有过。所以这样的题目印象中还是比较常见的,首先按照左端点进行排序,排好序以后判断右端点与下一个区间的左端点的关系来决定是否合并。
当然,我在这个过程中发现了java更加神奇的地方:1、java的Collections.sort函数及其相关函数调用;2、java中for的新用法。关于这两点其他随笔中也有总结
/** * Definition of Interval: * public class Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } */ class Solution { /** * @param intervals: Sorted interval list. * @return: A new sorted interval list. */ public List<Interval> merge(List<Interval> intervals) { // write your code here List<Interval> result = new LinkedList<>(); if(intervals == null || intervals.size()<1){ return result; } Collections.sort(intervals,new Comparator<Interval>(){ @Override public int compare(Interval o1,Interval o2){ return o1.start - o2.start; } }); Interval prev = null; for (Interval item : intervals) { if (prev == null || prev.end < item.start) { result.add(item); prev = item; } else if (prev.end < item.end) { prev.end = item.end; } } return result; } }