4. 寻找两个有序数组的中位数

2019-06-23  本文已影响0人  无米学炊

题目

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let m = nums1.length
    let n = nums2.length
    if (m > n) {
        let temp = nums1
        nums1 = nums2
        nums2 = temp
        temp = m 
        m = n
        n = temp 
    }
    let iMin = 0, iMax = m, mid = Math.floor((m + n + 1) / 2)
    while (iMin <= iMax) {
        let i = Math.floor((iMin + iMax) / 2)
        let j = mid - i
        if (i > iMin && nums1[i - 1] > nums2[j]) {
            iMax = i - 1
        } else if (i < iMax && nums1[i] < nums2[j - 1]) {
            iMin = i + 1
        } else {
            let leftMax
            if (i === 0) {
                leftMax = nums2[j - 1]
            } else if (j === 0) {
                leftMax = nums1[i - 1]
            } else {
                leftMax = Math.max(nums1[i - 1], nums2[j - 1])
            }
            if ((m + n) % 2) {
                return leftMax
            }
            
            let rightMin
            if (i === m) {
                rightMin = nums2[j]
            } else if (j === n) {
                rightMin = nums1[i]
            } else {
                rightMin = Math.min(nums1[i], nums2[j])
            }
            return (leftMax + rightMin) / 2
        }
    }
    return 0
}
上一篇下一篇

猜你喜欢

热点阅读