LeetCode:Merge Intervals

题目:

给一个集合的区间,把有重叠的区间合并起来

例子:

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considerred overlapping.

思路:

一开始我的思路是把start排序一遍,这样O(n)的复杂度就可以搞定,但是越写越恶心,因为边界情况很多。

代码:

/**
 * 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 {
    public List<Interval> merge(List<Interval> intervals) {

         List<Interval> result = new ArrayList<>();
            if (intervals == null || intervals.size() < 1) {
                return result;
            }

            Object[] intervalArr = intervals.toArray();
            Arrays.sort(intervalArr, new Comparator<Object>() {
                @Override
                public int compare(Object o1, Object o2) {
                    Interval interval1 = (Interval) o1;
                    Interval interval2 = (Interval) o2;
                    return Integer.compare(interval1.start, interval2.start);
                }
            });
             for (int i = 1; i < intervalArr.length; i++) {
                Interval ibefore = (Interval) intervalArr[i - 1];
                Interval intervalI = (Interval) intervalArr[i];
                if (intervalI.start <= ibefore.end) {
                    Interval newInter = new Interval(ibefore.start, intervalI.end > ibefore.end ? intervalI.end : ibefore.end);
                    intervalArr[i] = newInter;
                    addInterval(result, newInter);
                } else {
                    addInterval(result, ibefore);
                }
            }
            addInterval(result,(Interval)intervalArr[intervalArr.length-1]);
            return result;
        }

        private void addInterval(List<Interval> result, Interval interval) {
            Interval intervalTemp = null;
            if (result.size() > 0) {
                intervalTemp = result.get(result.size() - 1);
                if (intervalTemp.start == interval.start && intervalTemp.end < interval.end) {
                    result.remove(result.size() - 1);
                }
            }
            if (intervalTemp == null || intervalTemp.start != interval.start || intervalTemp.end != interval.end) {
                result.add(interval);
            }
        }
}

解法二:

将start,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 {
    public List<Interval> merge(List<Interval> intervals) {
        List<Interval> result = new ArrayList<>();
        if(intervals == null || intervals.size()<1){
            return result;
        }

        int length = intervals.size();
        int[] start = new int[length];
        int[] end = new int[length];
        for(int i = 0; i<length; i++){
            start[i] = intervals.get(i).start;
            end[i] = intervals.get(i).end;
        }

        Arrays.sort(start);
        Arrays.sort(end);

        for(int i=0,j=0; i<length; i++){
            if(i == length-1 || start[i+1] > end[i]){
                result.add(new Interval(start[j],end[i]));
                j = i+1;
            }
        }
        return result;
    }
}


编程   算法      算法 Leetcode

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!