JavaScript LeetCode004

102 阅读1分钟

寻找两个正序数组的中位数

给定两个大小分别为 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

image.png

image.png

image.png

image.png

image.png

image.png

思路:将两个排序好的数组整合成一个排序好的数组,找到其中位数就简单了。将两个数组的第一个元素取出,比较哪个更小放入新数组作为第一个元素,较大的放回原素组。一直执行上述步骤即可生成一个排序好的数组。当然,找中位数的话,只需按上述步骤执行到总长度一半即可得到中位数。 以下是代码实现(基于上述思路):

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