LeetCode解题 56:Merge Intervals
Problem 56: Merge Intervals [Medium]
Given a collection of intervals, merge all overlapping 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 considered overlapping.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
来源:LeetCode
解题思路
- 将二维数组按升序排序。
- 遍历合并区间,设当前区间为[start, end],当
intervals[i][1] <= end
时合并,取 e n d = max ( e n d , i n t e r v a l [ i ] [ 1 ] ) end = \max(end, interval[i][1]) end=max(end,interval[i][1]),否则将[start, end]加入最终结果,重新设置当前区间为[interval[i][0], interval[1]]。 - 注意:最后一个区间在遍历结束后需要加入最终结果。
整个算法排序后遍历一次数组,时间复杂度为 O ( n l o g n ) O(n log n) O(nlogn)。
Solution (Java)
class Solution {
public int[][] merge(int[][] intervals) {
int m = intervals.length;
if(m == 0 || m == 1) return intervals;
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] i1, int[] i2) {
if (i1[0] == i2[0]) return i1[1]-i2[1];
return i1[0]-i2[0];
}
});
List<int[]> result = new ArrayList<>();
int start = intervals[0][0];
int end = intervals[0][1];
for(int i = 1; i < m; i++){
if(intervals[i][0] <= end){
end = Math.max(end, intervals[i][1]);
}
else{
result.add(new int[] {start, end});
start = intervals[i][0];
end = intervals[i][1];
}
}
result.add(new int[] {start, end});
return result.toArray(new int[result.size()][2]);
}
}