004-寻找两个正序数组的中位数
原题:寻找两个正序数组的中位数
思路:计算出中位数需要遍历数组的次数,接着按从小到大的顺序遍历两数组直到步数 = 次数
思路
计算需要走多少步记为
end
;判断两数组总长度是否为偶数flag
;初始化两个变量记录当前值和上一个值(偶数时需要计算两数平均值)left = 0, right = 0
使用两个指针
let i = -1, j = -1
开始遍历两数组;使用计数let step = 0
记录步数如果第一个数组走到尽头,或者第一个数组的下一个值大于第二个数组的下一个值时
nums[i + 1] === undefined || nums1[i + 1] > nums2[j + 1]
,移动第二个数组的指针,步数增加,更新当前数和上一个数或者第二个数组走到尽头,或者第二个数组的下一个值大于等于第一个数组的下一个值时
nums2[j + 1] === undefined || nums2[j + 1] >= nums1[i + 1]
,移动第一个数组的指针,步数增加,更新当前数和上一个数如果走够了步数,根据前记录的奇偶返回对应的中间值
1. 计算需要几步
这里举个例子
假设两数组总长度为偶数 6
,那么 6 / 2 = 3
,偶数需要中间的两个数,所以我们遍历到中间的第二个数即 6 / 2 + 1 = 4
步
假设两数组总长度为奇数 5
,那么 5 / 2 = 2.5
,奇数只需要中间的一个数,所以我们遍历到 floor(5 / 2) + 1 = 3
或者 ceil(5 / 2) = 3
即可
为了奇偶数计算一致,我们选择向下取整 + 1 的算法
1 | const len = nums1.length + nums2.length; |
2. 初始化需要的变量
1 | // 是否为偶数 |
3. 遍历两个数组
用两个指针指向两个数组,同时用一个遍历记录步数
因为我们指向第一个元素时也需要计步,所以这里指针初始化为 -1
1 | for (let i = -1, j = -1, step = 0; ; ) { |
接着就是实现上面的思路,保证从小到大遍历两个数组,每次只走其中一侧
1 | // 如果 nums1 走到头 || nums1 下一个数大于 nums2 下一个数 |
走够步数后
1 | // 如果已经走够了步数 |
完整代码
1 | /** |