2022-03-10 「56. 合并区间」

2022-03-10  本文已影响0人  柠香萌萌鸡

今天早上又来二刷,思路还是有点偏离,双指针只想存放当前需要存放的数组边界。
但是看了答案后发现,其实准备存放的数组可以直接存在List中,如果列表为空,或者当前区间与上一区间不重合,直接添加,否则就更新区间的边界。

这里可以关注2个按数组首个元素排序的不同写法:

Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] interval1, int[] interval2) {
                return interval1[0] - interval2[0];
            }
        });

如果前面申请的是数组List类型的ans,那最后还要把ans转成二维数组格式:

merged.toArray(new int[merged.size()][]);

还有另外一种解法,更贴近我的思路,这里也贴上来参考:

public static int[][] merge(int[][] intervals) {
        if(intervals.length == 0){
            return new int[][]{};
        }
        Arrays.sort(intervals,(a,b)->{return a[0]-b[0];});
        int[][] res = new int[intervals.length][2];
        int index = 0;
        int start =intervals[0][0],end = intervals[0][1];
        //下一个数组的起始值必须要小于上一个数组的最大值才能合并
        for(int i = 1; i <intervals.length ; i++){
            //如果当前最小界比上一个的最大界小 说明可以合并 ,更新更新后的上界
            if(intervals[i][0]<=end){
                end = Math.max(intervals[i][1], end);
            }else {
                //说明不能继续合并了 ,把之前合并的结果存入结果集中
                res[index][0] = start;
                res[index][1] = end;
                index++;
                //更新start 和 end 为当前新范围
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        res[index][0] = start;
        res[index][1] = end;
        return Arrays.copyOfRange(res, 0, index+1);
    }
上一篇 下一篇

猜你喜欢

热点阅读