寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
思路:将两个排序好的数组整合成一个排序好的数组,找到其中位数就简单了。将两个数组的第一个元素取出,比较哪个更小放入新数组作为第一个元素,较大的放回原素组。一直执行上述步骤即可生成一个排序好的数组。当然,找中位数的话,只需按上述步骤执行到总长度一半即可得到中位数。 以下是代码实现(基于上述思路):
const findMedianSortedArrays = function(nums1, nums2) {
let i = j = 0, // 标记nums1 和 nums2取出的值的下标。这里没有真正取出值放入新数组,只需标记下即可
total = nums1.length + nums2.length,
midLen = Math.ceil((total + 1) / 2), // 查找中位数需要循环的次数
mid1 = mid2 = 0; // mid2存储本次循环要放入新数组的数,mid1存储上一次循环放入新数组的数
for(let k = 0; k < midLen; k++){
mid1 = mid2 //新循环将mid2中的值给mid1作为上一次的值
if(i < nums1.length && j < nums2.length){
if(nums1[i] < nums2[j]){
mid2 = nums1[i]
i++
}else{
mid2 = nums2[j]
j++
}
}else if(i >= nums1.length){
mid2 = nums2[j]
j++
}else if(j >= nums2.length){
mid2 = nums1[i]
i++
}
}
// total为奇数或偶数时的中位数
if(total % 2 === 0){
return (mid1 + mid2) / 2
}
return mid2;
};