Merge Intervals
19% Accepted
Given a collection of intervals, merge all overlapping intervals.
Have you met this question in a real interview? Yes
Example
Given intervals => merged intervals:
[                     [
  [1, 3],               [1, 6],
  [2, 6],      =>       [8, 10],
  [8, 10],              [15, 18]
  [15, 18]            ]
]
Challenge
- O(n log n) time and O(1) extra space.
Tags Expand
- Sort
- Array
思路
- 需要掌握comparator 也是简化解题的关键
- You use remove function, which will cost O(n) each time in worst case. That means, in your for loop, the time complexity is O(n^2).
- 所以能少用remove就少用
- 所以写了第二个代码
/**
 * 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 == null || intervals.size() == 0) {
            return new ArrayList<Interval>();
        }
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2) {
                if (i1.start != i2.start) {
                    return i1.start - i2.start;
                } else {
                    return i2.end - i2.end;
                }
            }
        });
        int i = 1;
        while (i < intervals.size()) {
            Interval first = intervals.get(i - 1);
            Interval second = intervals.get(i);
            if (first.end >= second.start) {
                first.end = Math.max(first.end, second.end);
                intervals.remove(i);
            } else {
                i++;
            }
        }
        return intervals;
    }
}
思路
/**
 * 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) {
        List<Interval> result = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            return result;
        }
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2) {
                if (i1.start != i2.start) {
                    return i1.start - i2.start;
                } else {
                    return i2.end - i2.end;
                }
            }
        });
        Interval cur = intervals.get(0);
        result.add(cur);
        for (int i = 1; i < intervals.size(); i++) {
            cur = result.get(result.size() - 1);
            Interval second = intervals.get(i);
            if (cur.end >= second.start) {
                cur.end = Math.max(cur.end, second.end);
            } else {
                result.add(second);
            }
        }
        return result;
    }
}