leetcode-56 Merge Intervals 合并区间

问题描述:

Given a collection ofintervals, merge all overlapping intervals.

For example,
Given 
[1,3],[2,6],[8,10],[15,18],
return 
[1,6],[8,10],[15,18].

Subscribe to see which companies asked thisquestion

 

问题分析:

常见的合并区间问题,如果所有区间都是乱序排序列的话,需要记录的数据量之大可想而知;故这里采用首先对所有Intervals根据其start的位置,进行一次排序。排序的时间复杂度为O(nlgn);

排序之后所有Intervals的start都是顺序的,下面可以对其进行遍历;比较有两种情况:

1)      Interval的start在当前区间之内,即interval.start <=this_interval.end;则可以将当前的interval与前一个区间连接到一起。只需要更新end值即可;

2)      如果interval.start > this_interval.end,则表示中间发生了断层,不能和前一个区间连接到一起,则将前一个区间添加在结果列表中。然后更新新的考察区间值start与end为interval的区间值。

   

代码:

/**
 * 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; }
 * }
 */
public class Solution {
    public List<Interval>merge(List<Interval> intervals) {
        if (intervals.size() <= 1)
            return intervals;

        // 先根据Interval类的start首位置进行排序
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval i1, Interval i2) {
                return Integer.compare(i1.start, i2.start);
            }
        });

        List<Interval> result = new LinkedList<Interval>();
        int start = intervals.get(0).start;
        int end = intervals.get(0).end;

        // 遍历所有Interval
        for (Interval interval : intervals) {
            if (interval.start <= end) // 如果start值在前一个区间范围内,则更新end值即可
                end = Math.max(end, interval.end);
            else {                     // 如果start值不在前一个区间范围内,由于之前已经按照start顺序排列过,因此表示中间发生了断层
                result.add(new Interval(start, end)); // 将前一区间值保存至结果
                start = interval.start;               // 更新新的区间的范围值
                end = interval.end;
            }
        }

        // 注意将最后一个区间添加到结果列表中
        result.add(new Interval(start, end));
        return result;
    }
}
 


你可能感兴趣的:(leetcode-56 Merge Intervals 合并区间)