Question
Given an array of intervals
where intervals[i] = [starti, endi]
, merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.
Example 1:
Input: intervals = [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6].
Algorithm
For this question, we need to sort the array intervals by their start.(interval[0]
) by full sort.
Why do this? For example, after sorting, all the start will have an order, and if the next one's start is larger than the previous one's end, that means they have no overlap; if one's start is smaller than it's previous one's end, that mean they have overlaps and needs to be merged. And the larger end of them will be treat as the new end.
Code
class Solution { public int[][] merge(int[][] intervals) { Arrays.sort(intervals, (a, b) -> (a[0] - b[0])); List<int[]> res = new ArrayList<>(); int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 0; i < intervals.length; i++) { if (intervals[i][0] > end) { res.add(new int[]{start, end}); start = intervals[i][0]; end = intervals[i][1]; } else { end = Math.max(end, intervals[i][1]); } if (i == intervals.length - 1) { res.add(new int[]{start, end}); } } int[][] result = new int[res.size()][2]; for (int i = 0; i < res.size(); i++) { result[i][0] = res.get(i)[0]; result[i][1] = res.get(i)[1]; } return result; } }
One small ortimization on implementation is that:
int[][] result = new int[res.size()][2]; for (int i = 0; i < res.size(); i++) { result[i][0] = res.get(i)[0]; result[i][1] = res.get(i)[1]; }
can be written as res.toArray(new int[size][2]);