题目描述:
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.
中文理解:
给定一个二维数组n*2,二维数组每一个1*2元素含义上代表一个线段,给出所有线段的合并结果。
解题思路:
首先将二维数组按照第一个第一个维度排序,然后设置第一个数组元素为start和end,遍历二维数组,当数组元素的起始值小于end,更新end和数组元素的第二个至;当数组元素起始值大于end,则将start和end放入结果中,同时更新start和end为当前这个元素的值,依次进行即可。
代码(java):
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length <= 1) return intervals;
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
int start = intervals[0][0];
int end = intervals[0][1];
List<int[]> res = new ArrayList<>();
for (int[] interval : intervals) {
if (interval[0] <= end) {
end = Math.max(end, interval[1]);
} else {
res.add(new int[]{start, end});
start = interval[0];
end = interval[1];
}
}
res.add(new int[]{start, end});
int[][] ans = new int[res.size()][2];
for (int i = 0; i < res.size(); i++) {
ans[i][0] = res.get(i)[0];
ans[i][1] = res.get(i)[1];
}
return ans;
}
}