问题描述:
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:
首先对给定的而为数组按照第一个元素从小到大排序,然后对数组的元素逐个遍历。相邻的两个以为数组表示的范围由如下3种情况:
1、 |____________|
|_______|
2、 |____________|
|____________|
3、 |____________|
|_______|
对第1、2两种情况,需要合并数组区间。
java代码:
public int[][] merge(int[][] intervals) { if(null == intervals || intervals. length == 0 || intervals[0].length == 0){ return intervals; } Arrays.sort(intervals, new Comparator<int[]>() { @ Override public int compare(int[] one, int[] two) { if (one[0] > two[0]) { return 1; } else if (one[0] < two[0]) { return -1; } else { return 0; } } }); int[][] result = new int[intervals.length][intervals[0].length]; int cnt = 0; int [] cur = intervals[0]; for(int i = 1; i < intervals.length ; i ++){ int [] arr = intervals[i]; if(arr[0] <= cur[1] && arr[1] >= cur[1]){ cur[1] = arr[1]; }else if(arr[0] >= cur[0] && arr[1] <= cur[1]){ continue ; }else{ result[cnt++] = cur; cur = arr; } } result[cnt++] = cur; return Arrays.copyOf(result,cnt); }