56. Merge Intervals

来源:互联网 发布:应用商店要windows更新 编辑:程序博客网 时间:2024/06/12 19:18

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].

给定一些间隔的集合,合并所有有重叠的间隔。

从题目中给的例子来看,可以发现,如果下一个间隔的start小于当前间隔的end的时候,两个间隔可以合并。题目中给的间隔 是按照间隔的start有序排列的,如果给定的间隔无序并且间隔比较多的话,例如[1,3],[8,10],[2,6],[4,5]......这时需要对间隔按照start进行排序,然后对每个间隔,比较它的end和下一个间隔的start的大小,如果end<下一个间隔的start则将这个新的间隔加入到要返回的结果中,如果不小于,说明两个间隔没有重叠,那么让start,end等于新的间隔的start和end即可。代码如下:

if(intervals.size()<=1){        return intervals;        }        //按照每个间隔的start的大小,按升序排序(这里使用的是匿名函数)        intervals.sort((i1, i2)->Integer.compare(i1.start, i2.start));                List<Interval> res = new LinkedList<Interval>();        int start = intervals.get(0).start;        int end = intervals.get(0).end;        //比较下一个间隔的start与当前间隔的end        for(Interval interval:intervals){        if(interval.start<=end){        end = Math.max(end, interval.end);        }else{        res.add(new Interval(start, end));        start = interval.start;        end = interval.end;        }        }        //把最后一个间隔加上        res.add(new Interval(start, end));        return res;