Optimal: sort and sweep
Time O(n log n) Space O(n)Sort by start. For each interval, if it starts ≤ the last merged end, extend; else append it.
import java.util.*;
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
List<int[]> out = new ArrayList<>();
for (int[] cur : intervals) {
if (!out.isEmpty() && cur[0] <= out.get(out.size() - 1)[1]) {
int[] last = out.get(out.size() - 1);
last[1] = Math.max(last[1], cur[1]);
} else {
out.add(new int[]{cur[0], cur[1]});
}
}
return out.toArray(new int[0][]);
}
}Verdict: Standard.