LeetCode4. 寻找两个正序数组的中位数(go实现)

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

没有用另外的数组缓存实现

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

    var ret float64

    ret = 0

    length1 := len(nums1)

    length2 := len(nums2)

    if length1 == 0 && length2 == 0 {

        return ret

    }

    //即求nums2的中位数

    if length1 == 0 {

        ret = GetMedianNum(nums2)

        return ret

    }

    //即求nums1的中位数

    if length2 == 0 {

        ret = GetMedianNum(nums1)

        return ret

    }

    length_total := length1 + length2

    if length_total % 2 == 0 {

        index := length_total / 2 - 1

        //转为求第index小的值和index+1的值

        i := 0

        j := 0

        for (i+j) < index && (i<length1 || j<length2) {

            if i == length1 {            //防止越界

                j++

            } else if j == length2 {     

                i++

            }else {

                if(nums1[i] < nums2[j]) {

                    i++

                } else { 

                    j++

                }

            }

        }

        //nums1和nums2都没遍历完

        if i != length1 && j != length2 {

            if nums1[i] == nums2[j] {

                ret = float64(nums1[i])

            } else if nums1[i] < nums2[j] {

                if i + 1 != length1 && nums1[i+1] <= nums2[j] {

                    ret = (float64(nums1[i]) + float64(nums1[i+1]))/2

                } else {

                    ret = (float64(nums1[i]) + float64(nums2[j]))/2

                }

            } else {

                if j + 1 != length2 && nums2[j+1] <= nums1[i] {

                    ret = (float64(nums2[j]) + float64(nums2[j+1]))/2

                } else {

                    ret = (float64(nums1[i]) + float64(nums2[j]))/2

                }

            }

        } else if i == length1 {

            ret = (float64(nums2[j]) + float64(nums2[j+1]))/2

        } else if j == length2 {

            ret = (float64(nums1[i]) + float64(nums1[i+1]))/2

        }

    } else {

        index := length_total / 2

        //转为求第index小的值

        i := 0

        j := 0

        for (i+j) < index && (i<length1 || j<length2) {

            if i == length1 {            //防止越界

                j++

            } else if j == length2 {     

                i++

            }else {

                if(nums1[i] < nums2[j]) {

                    i++

                } else { 

                    j++

                }

            }

        }

        //nums1和nums2都没遍历完

        if i != length1 && j != length2 {

            if nums1[i] < nums2[j] {

                ret = float64(nums1[i])

            } else {

                ret = float64(nums2[j])

            }

        } else if i == length1 {      //说明nums1被遍历完

            ret = float64(nums2[j])

        } else if j == length2 {

            ret = float64(nums1[i])   //说明nums2被遍历完

        }

    }

    return ret

}

// 求一个数组的中位数

func GetMedianNum(nums []int) float64 {

    var ret float64

    ret = 0

    length := len(nums)

    if length % 2 == 0 {

        ret = (float64(nums[length/2-1]) + float64(nums[length/2]))/2

    } else {

        ret = float64(nums[length/2])

    }

    return ret

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值