LeetCode 数组:56.合并区间(数组的自带排序函数 区间合并问题)

 

 

对于这道题目我只能说,是我想太多。

首先,我不知道Array自带的排序函数,想着要手写一个排序得多麻烦。。。

其次,我第一个想法就是拍完序后从前往后合并,但是好像老觉得无法穷举,感觉这样排会有问题。

然后变得想,可能会变成嵌套循环的那种求交集

其实是没问题的,首先看两个区间的可能情况:


 

 可以这样手画一下三个区间的情况,只要处理完第一个和第二个区间后的结果,和第三个区间仍然能满足首元素升序的条件,这样一直合并就没有问题。

 

关于数组的排序Array.sort()的方法,可以自定义比较器,这里我们用匿名表达式定义就好

时间复杂度能达到nlogn

对于ArrayList则使用Collection.sort()

详细见下文:
https://my.oschina.net/u/4279315/blog/4321974

 

另一个问题在于我们用来存放结果的数组不知道应该length应该填多少。

我们可以新建时以inteval.length新建,再弄一个指针指示最后一个结果的index,最后在部分copy或者只返回前部分就行

class Solution {
    public int[][] merge(int[][] intervals) {
        // 先按照区间起始位置排序
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
        // 遍历区间
        int[][] res = new int[intervals.length][2];
        int idx = -1;
        for (int[] interval: intervals) {
            // 如果结果数组是空的,或者当前区间的起始位置 > 结果数组中最后区间的终止位置,
            // 则不合并,直接将当前区间加入结果数组。
            if (idx == -1 || interval[0] > res[idx][1]) {
                res[++idx] = interval;
            } else {
                // 反之将当前区间合并至结果数组的最后区间
                res[idx][1] = Math.max(res[idx][1], interval[1]);
            }
        }
        return Arrays.copyOf(res, idx + 1);
    }
}

 

posted @ 2020-07-31 10:28  将来的事  阅读(270)  评论(0编辑  收藏  举报