4. Median of Two Sorted Arrays Go语言

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

思路:
查找两个有序数组的中间的元素,可以转化成查找两个有序数组的第k个元素(言外之意,就是找到 k-1个较小的元素)。则需要将 nums1 的第pa个元素与 nums2 的第pb个元素进行比较,其中,pa + pb =k。
1、若nums1[pa - 1] < nums2[pb - 1],则 nums1的pa 个元素必定在 k - 1 个较小的元素中,则可去掉 nums1 的 pa 个元素
2、若nums1[pa - 1] > nums2[pb - 1],则 nums2的pb 个元素必定在 k - 1 个较小的元素中,则可去掉 nums2 的 pb 个元素
3、若 nums1[pa - 1] == nums[pb - 1],则 nums1 中的 pa - 1 个较小元素以及 nums2 中的 pb - 1 个较小的元素必定在 k - 1 个较小的元素中。
pa - 1 + pb - 1 = k - 2。其目的是,寻找k-1个较小的元素,则nums1[pa - 1] 便是要找的元素

package main

import "fmt"

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	len1 := len(nums1)
	len2 := len(nums2)
	if (len1 + len2)%2 == 1 {
		ret := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 + 1)
		return float64(ret)
	} else {
		ret1 := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 )
		ret2 := findKNum(nums1, 0, len(nums1) - 1, nums2, 0, len(nums2) - 1,(len1 + len2)/2 + 1)
		return float64(ret1 + ret2)/2
	}
}

func findKNum(nums1 []int, beg1 int, end1 int, nums2 []int, beg2 int, end2 int, k int) int {
	len1 := end1 - beg1 + 1
	len2 := end2 - beg2 + 1
	if (len1 > len2){
		return findKNum(nums2, beg2, end2, nums1, beg1, end1, k)
	}
	if (len1 == 0){
		return nums2[beg2 + k - 1]
	}
	if (k == 1){
		if (nums1[beg1] < nums2[beg2]){
			return nums1[beg1]
		}
		return nums2[beg2]
	}
	pa := len1
	if (k/2 < len1){
		pa = k/2
	}
	pb := k - pa
	if (nums1[beg1 + pa - 1] < nums2[beg2 + pb - 1]){
		return findKNum(nums1, beg1 + pa , end1, nums2, beg2, end2, k - pa)
	} else if (nums1[beg1 + pa - 1] > nums2[beg2 + pb - 1]){
		return findKNum(nums1, beg1, end1, nums2, beg2 + pb, end2, k - pb)
	} else {
		return nums1[beg1 + pa - 1]
	}
}

func main()  {
	nums1 := []int{1, 3}
	nums2 := []int{2}
	ret := findMedianSortedArrays(nums1,nums2)
	fmt.Println(ret)
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值