力扣56. 合并区间,每日刷题

1. 题目:

给出一个区间的集合,请合并所有重叠的区间。注意不是有序的

输入: [[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

2. 先按照第一个元素对集合排序

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

3. 完整代码,效率击败85%的用户

折腾了好久,最后把完整代码如下贴下吧:

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%的用户

你可能感兴趣的:(算法与刷题)