寻找两个正序数组的中位数
题目描述
方法一:
合并两个数组,对新数组求中位数。
1 | class Solution { |
方法二:
用 len 表示合并后数组的长度,如果是奇数,我们需要知道第 (len+1)/2
个数就可以了,如果遍历的话需要遍历 int(len/2 ) + 1
次。如果是偶数,我们需要知道第 len/2
和 len/2+1
个数,也是需要遍历 len/2+1
次。所以遍历的话,奇数和偶数都是 len/2+1
次。
返回中位数的话,奇数需要最后一次遍历的结果就可以了,偶数需要最后一次和上一次遍历的结果。所以我们用两个变量 left 和 right,right 保存当前循环的结果,在每次循环前将 right 的值赋给 left。这样在最后一次循环的时候,left 将得到 right 的值,也就是上一次循环的结果,接下来 right 更新为最后一次的结果。
循环中该怎么写,什么时候 A 数组后移,什么时候 B 数组后移。用 aStart
和 bStart
分别表示当前指向 A 数组和 B 数组的位置。如果 aStart 还没有到最后并且此时 A 位置的数字小于 B 位置的数组,那么就可以后移了。也就是aStart<m && A[aStart]< B[bStart]
。
但如果 B 数组此刻已经没有数字了,继续取数字 B[ bStart ]
,则会越界,所以判断下 bStart 是否大于数组长度了,这样 || 后边的就不会执行了,也就不会导致错误了,所以增加为aStart<m && (bStart >= n||A[aStart]<B[bStart])
。
作者:windliang
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/solutions/8999/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/
来源:力扣(LeetCode)
1 | class Solution { |
方法三:
使用二分法,思路见下方链接。最终时间复杂度:每进行一次循环,我们就减少 k/2 个元素,所以时间复杂度是 O(log(k),而 k=(m+n)/2,所以最终的复杂也就是 O(log(m+n)O(log(m+n)O(log(m+n)。
空间复杂度:虽然我们用到了递归,但是可以看到这个递归属于尾递归,所以编译器不需要不停地堆栈,所以空间复杂度为 O(1)O(1)O(1)。
作者:windliang
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/solutions/8999/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-2/
来源:力扣(LeetCode)
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |