[LeetCode

来源:互联网 发布:某酒店2000w数据 编辑:程序博客网 时间:2024/06/15 21:41

1 问题

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

2 分析

题目要合并重叠的区间,直觉上需要将区间排序。排序的方法是:

  • 先按照区间左端点排序
  • 如果左端点相同,再按照右端点排序

假设排序后的区间为 [[a1,a2],[a3,a4],[a5,a6]...],便可以从左到右,逐个合并区间。下面以 [a1,a2],[a3,a4]为例,根据a2a3,a4的位置关系,可以分为以下情况:

  1. a2<a3 这种情况下,两个区间不需要合并.
  2. a3a2a4 这种情况下,这两个区间需要合并,合并后区间的左端点是a1, 右端点是 a4.
  3. a2>a4 这种情况下, 这两个区间需要合并,合并后区间的左端点是a1, 右端点是 a2.

重复以上步骤,直到所有的区间都被合并处理。

3 代码

public class Solution {    public List<Interval> merge(List<Interval> intervals) {        Collections.sort(intervals,                     new Comparator<Interval>(){                        public int compare(Interval o1, Interval o2){                            if(o1.start != o2.start){                                return o1.start - o2.start;                                }else{                                return o1.end - o2.end;                            }                        }                    }        );        int i = 0;        while(i < intervals.size() - 1){            if(intervals.get(i).end >= intervals.get(i+1).start){                intervals.get(i).end = Math.max(intervals.get(i).end, intervals.get(i+1).end);                intervals.remove(i+1);            }else{                i = i + 1;            }        }        return intervals;    }}

代码中有以下几点需要注意:

  • 使用Collections.sort方法对List进行排序
  • Comparator<T>()接口可以使用lambda表达式代替,简化代码
  • while()循环可以用iterator代替,使逻辑更加清晰
原创粉丝点击