给出一个区间的集合,请合并所有重叠的区间。注意不是有序的
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
int arr [][]=new int[][]{{1,2},{4,5},{7,9}, {2, 3}, {4, 5},{4, 8}};
System.out.println(arr[0].length);//2
System.out.println(arr.length);//6
判断有多少个小集合的是:arr.length
int arr [][]=new int[][]{{1,2},{4,5},{7,9}, {2, 3}, {4, 5},{4, 8}};
//System.out.println(arr[0].length);
//System.out.println(arr.length);
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
for(int i=0;i<arr.length;i++){
System.out.println(arr[i][0]);
}
结果是:有序的,可见,上面已经对一个集合进行了排序
1
2
4
4
4
7
折腾了好久,最后把完整代码如下贴下吧:
int len = intervals.length;
if (intervals.length < 2) {
return intervals;
}
//排序
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
int start = intervals[0][0];
int end = intervals[0][intervals[0].length - 1];
int chongfu = len;
for (int i = 1; i < len; i++) {
if (intervals[i][0] >= start && intervals[i][0] <= end) {
chongfu--;
}
start = Math.min(start, intervals[i][0]);
end = Math.max(end, intervals[i][intervals[i].length - 1]);
}
//上面的是对排过序的数组,找能合并的个数,最终返回的结果集的个数是chongfu
//下面一行声明一个结果集
int[][] res = new int[chongfu][];
int num = 1;
int[] one0 = new int[2];
one0[0] = intervals[0][0];
one0[1] = intervals[0][intervals[0].length - 1];
res[0] = one0;
int thisLen = 0;
//核心代码,进行比较
for (int i = 1; i < len; i++) {
thisLen = intervals[i].length;
int one[] = new int[2];
if (intervals[i][0] >= res[num - 1][0] && intervals[i][0] <= res[num - 1][1]) {
one[0] = Math.min(res[num - 1][0], intervals[i][0]);
one[1] = Math.max(res[num - 1][1], intervals[i][thisLen - 1]);
res[num - 1] = one;
} else {
one[0] = intervals[i][0];
one[1] = intervals[i][thisLen - 1];
res[num] = one;
num++;
}
}
return res;
执行用时 :17 ms, 在所有 Java 提交中击败了71.46%的用户
内存消耗 :40.2 MB, 在所有 Java 提交中击败了85.57%的用户