LeetCode 56. Merge Intervals

来源:互联网 发布:手机恶意坑人软件 编辑:程序博客网 时间:2024/06/02 06:11
56. Merge Intervals
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].
思路分析:
第一步:应当将所给的intervals排序,即需要重写排序算法。排序规则为:给定interval a , b.我们将对其a.start 和 b.start 进行比较
第二步:排序完成后,依次遍历整个intervals,第一个interval可以先加入结果集res;
              如果结果集中res.get(res.size() - 1).end < 下一个待加入结果集(正在进行判断)的 interval.start, 说明两个interval没有重叠区              域,可以直接加入
             否则:说明存在重叠区域,此时修改结果集中res.get(res.size() - 1).end的值,为结果集中res.get(res.size() - 1).end,或者待加入            结果集中的interval.end中较大的一个。
注意:在第一步比较过程中,我们已经确定每次首先加入结果集的一定是start较小的位,但并没有规定end位的排序,因此在后面的比较中,如果存在重叠区域,我们只需要确定现有结果集和待加入的interval中end位较大即可保证归并了重叠区域。
代码实现如下:
/**
* Definition for an interval.
* public class Interval {
*     int start;
*     int end;
*     Interval() { start = 0; end = 0; }
*     Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
    private class IntervalComparator implements Comparator<Interval>{
        @Override
        public int compare(Interval a, Interval b){
            return a.start < b.start ? -1 : a.start == b.start ? 0 : 1;
        }
    }
    
    public List<Interval> merge(List<Interval> intervals) {
        Collections.sort(intervals, new IntervalComparator());
        
        List<Interval> res = new ArrayList<>();
        for(Interval interval : intervals){
            if(res.isEmpty() || res.get(res.size() - 1).end < interval.start){
                res.add(interval);
            }else{
                res.get(res.size() - 1).end = Math.max(res.get(res.size() - 1).end, interval.end);
            }
        }
        return res;
    }
}
原创粉丝点击