LeetCode打卡 Day8 — 寻找两个正序数组的中位数

1. 题目

2. 题目解答 

2.1 解1

答案1是我自己的解法,较为暴力,直接将两个数组合并为一个并对其进行排序,排序后根据索引获取对应的中位数,具体代码如下:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    var res float64

    nums1 = append(nums1,nums2...)
    sort.Ints(nums1)
    l := len(nums1)
    var index int = l/2
    if l%2==0 {
        res = float64(nums1[index-1]+nums1[index])/2
    }else{
        res = float64(nums1[index])
    }

    return res
}

 提交结果如下

 2.2 解2(参考官方答案)

使用二分查找进行解答,设两个数组长度分别为m和n,目标在于在两个数组中找位于(m+n)/ 2+1 的数字(m+n为奇数)或者位于(m+n)/2和(m+n)/2+1的数字(m+n为偶数)。

令 k=(m+n)/2,两个数组分别为A和B,算法基本思路如下:

1)迭代内容:比较A[k/2]以及B[k/2]

(1)A[k/2]<=B[k/2] :去除A[0:k/2]的元素(注意:这里要注意去除的元素个数是否超过了数组的实际长度),k = k-k/2

(2)A[k/2] > B[k/2] :去除B[0:k/2]的元素(同样要注意数组的长度),k = k-k/2

2)迭代停止:在以下两种情况下可停止迭代

(1)有一个数组为空:存在一个数组除去元素后,数组为空,返回另一个数组的第k个元素

(2)k=1:比较两个数组当前的第一个元素,返回其中较小的元素

具体代码如下:

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    totalLength := len(nums1)+len(nums2)
    mid := totalLength/2
    if totalLength%2 == 0{
        return (KthGet(nums1, nums2, mid)+KthGet(nums1, nums2, mid+1))/2.0
    }else{
        return KthGet(nums1, nums2, mid+1)
    }
}

func KthGet(nums1, nums2 []int, k int) float64{
    indexA, indexB := 0, 0      // index作为两个数组每次搜索起始位置
    for{
        // 依次判断是否满足结束条件
        if indexA == len(nums1){
            return float64(nums2[indexB + k-1])
        }
        if indexB == len(nums2){
            return float64(nums1[indexA + k-1])
        }
        if k == 1{
            return float64(GetMin(nums1[indexA],nums2[indexB]))
        }

        halfK := k/2
        indexAt := GetMin(indexA+halfK, len(nums1))
        indexBt := GetMin(indexB+halfK, len(nums2))
        if nums1[indexAt-1]<=nums2[indexBt-1]{
            k = k-(indexAt-indexA)
            indexA = indexAt
        }else{
            k = k-(indexBt-indexB)
            indexB = indexBt
        }
    }
}

func GetMin(a, b int) int{
    if a<=b{
        return a
    }else{
        return b
    }
}

提交结果如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值