September 07, 2019

56. Merge Intervals

56. Merge Intervals

扫描线法
Sort intervals by its start:
if cur.start <= last.end: Merge intervals
else: insert a new interval

Time = O(nlogn), Space = O(n)

class Solution {
    public int[][] merge(int[][] intervals) {
        
        if (intervals.length <= 1) {
            return intervals;
        }
        
        Arrays.sort(intervals, new Comparator<int[]> () {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        
        List<int[]> mergedIntervals = new ArrayList<>();
        int[] interval = intervals[0];
        for (int i = 1; i < intervals.length; i++) {
            int[] curInterval = intervals[i];
            if (interval[1] >= curInterval[0]) {
                interval = new int[]{interval[0], Math.max(interval[1], curInterval[1])};
            } else {
                mergedIntervals.add(interval);
                interval = curInterval;
            }
        }
        mergedIntervals.add(interval);
        return mergedIntervals.toArray(new int[mergedIntervals.size()][]);
    }
}

下面附上另一种做法:

class Solution {
    public int[][] merge(int[][] intervals) {
        int[] start = new int[intervals.length];
        int[] end = new int[intervals.length];
        
        for (int i = 0; i < intervals.length; i++) {
            start[i] = intervals[i][0];
            end[i] = intervals[i][1];
        }
        
        Arrays.sort(start);
        Arrays.sort(end);
        
        ArrayList<int[]> newIntervals = new ArrayList<>();
                    
        int i = 0;
        while (i < start.length) {
            int curStart = start[i];
            int curEnd = end[i];
            int j = i + 1;
            while (j < start.length) {
                if (start[j] <= curEnd) {
                    curEnd = end[j];
                    i++;
                    j++;
                } else {
                    break;
                }
            }
            newIntervals.add(new int[]{curStart, curEnd});
            i++;
        }
        
        int[][] res = new int[newIntervals.size()][2];
        
        for (int k = 0; k < newIntervals.size(); k++) {
            res[k] = new int[]{newIntervals.get(k)[0], newIntervals.get(k)[1]};
        }
        return res;
    }
}
comments powered by Disqus