合并区间

来源:互联网 发布:淘宝图书讲谈社 编辑:程序博客网 时间:2024/05/22 06:35

给出若干闭合区间,合并所有重叠的部分。

样例

给出的区间列表 => 合并后的区间列表:

[                     [  [1, 3],               [1, 6],  [2, 6],      =>       [8, 10],  [8, 10],              [15, 18]  [15, 18]            ]]
 /**     * 按照区间上限对区间从小到大排序     */    Comparator<Interval> comparator = new Comparator<Interval>() {        @Override        public int compare(Interval o1, Interval o2) {            if (o1.end > o2.end) return 1;            else if (o1.end < o2.end) return -1;            return 0;        }    };    /**     * 首先根据区间的上限,对区间进行从小到大排序,然后从上限区间最大的开始合并,若当前区间的下限小于等于前一个区间的上限,     * 就进行区间合并,得到新的一个区间,然后将合并产生的新区间作为当前区间继续与前一个区间比较,若无法合并,则将当前区间加     * 入List,并把前一个区间作为当前区间,最后全部比较完后把最后一个区间加入List     *     * @param intervals     * @return     */    public List<Interval> merge(List<Interval> intervals) {        if (intervals.size() == 0) return intervals;        Collections.sort(intervals, comparator);        //        System.out.println(intervals);        List<Interval> result = new ArrayList<>();        Interval current = intervals.get(intervals.size() - 1);        for (int i = intervals.size() - 2; i >= 0; i--) {            Interval pre = intervals.get(i);            Interval merge = null;            if (current.start <= pre.end) {                merge = new Interval(pre.start > current.start ? current.start : pre.start, current.end);                current = merge;            } else {                result.add(current);                current = pre;            }        }        result.add(current);        Collections.sort(result, comparator);        return result;    }




原创粉丝点击