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

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

题目描述:

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

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000

思路:

最简单的思路

代码:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    flag := 0
    if (len(nums1)+len(nums2)) % 2 ==1{
        flag = 0
    }else{
        flag = 1
    }
    mid := (len(nums1)+len(nums2))/2
    nums := make([]int, len(nums1)+ len(nums2))
    var i,j int
    for i ,j = 0,0;i<len(nums1) && j <len(nums2);{
        if nums1[i] < nums2[j]{
            nums[i+j] = nums1[i]
            i++
        }else{
            nums[i+j] = nums2[j]
            j++
        }
    }
    if i == len(nums1) && j<len(nums2){
        for ;j<len(nums2);j++{
            nums[i+j] = nums2[j]
        }
    }
    if j == len(nums2) && i <len(nums1){
        for ;i<len(nums1);i++{
            nums[i+j] = nums1[i]
        }
    }
    if len(nums) == 0{
        return 0
    }
 
    if flag == 0{
        return float64(nums[mid])
    }else{
        return  (float64(nums[mid])+float64(nums[mid-1]))/2
    }
}

代码效率:

执行用时:12 ms, 在所有 Go 提交中击败了88.16%的用户
内存消耗:5.4 MB, 在所有 Go 提交中击败了41.09%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!