【leetcode】两个排序数组的中位数

47 阅读1分钟
题目大意

给定两个已经升序排列好的数组,要求找出两个数组所有数字的中位数,例如:nums1=[1,2] nums2=[3,4] 那么。根据定义,中位数应该是 2和3相加再除以2,即中位数为 (2+3)/2 = 2.5 现在给定两个数组,要求以 O(log(m+n))O(log(m+n))的时间复杂度找出这个中位数。

直接上代码:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    length := len(nums1) + len(nums2)
    if length%2 != 0 {
       return float64(helper(nums1, nums2, (length+1)/2))
    } else {
       x := float64(helper(nums1, nums2, length/2))
       y := float64(helper(nums1, nums2, length/2+1))
       return (x + y) / 2
    }
}
func helper(nums1 []int, nums2 []int, k int) int {
    if len(nums1) == 0 {
       return nums2[k-1]
    }
    if len(nums2) == 0 {
       return nums1[k-1]
    }
    if k == 1 {
       return min(nums1[0], nums2[0])
    }
    countOne := min(k/2, len(nums1))
    maxOne := nums1[countOne-1]
    countTwo := min(k/2, len(nums2))
    maxTwo := nums2[countTwo-1]
    if maxOne < maxTwo {
       return helper(nums1[countOne:], nums2, k-countOne)
    } else {
       return helper(nums1, nums2[countTwo:], k-countTwo)
    }
}

func min(a, b int) int {
    if a < b {
       return a
    }
    return b
}