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); } }