4寻找两个正序数组中的中位数-困难

本文介绍如何使用Go语言解决两个已排序数组的中位数问题,通过合并数组和二分查找法实现O(log(m+n))的时间复杂度。实例演示了奇数和偶数元素个数的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题: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

提示

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

代码Go

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	var ans float64
	len1 := len(nums1)
	len2 := len(nums2)
	allLen := len1 + len2
	if allLen%2 != 0 {
		// 处理 奇数个元素
		ans = solveOdd(nums1, nums2, int(allLen/2))
	} else {
		// 处理 偶数个元素
		ans = solveEven(nums1, nums2, int(allLen/2))
	}
	return ans
}

func solveOdd(nums1 []int, nums2 []int, num int) float64 {
	res := 0.0
	index1 := 0
	index2 := 0
	for i := 0; i <= num; i++ {
		if index1 >= len(nums1) {
			res = float64(nums2[index2])
			index2++
			continue
		}
		if index2 >= len(nums2) {
			res = float64(nums1[index1])
			index1++
			continue
		}
		if nums1[index1] > nums2[index2] {
			res = float64(nums2[index2])
			index2++
		} else {
			res = float64(nums1[index1])
			index1++
		}
	}
	return res
}

func solveEven(nums1 []int, nums2 []int, num int) float64 {
	res := 0.0
	pre := 0.0
	index1 := 0
	index2 := 0
	for i := 0; i <= num; i++ {
		if index1 >= len(nums1) {
			pre = res
			res = float64(nums2[index2])
			index2++
			continue
		}
		if index2 >= len(nums2) {
			pre = res
			res = float64(nums1[index1])
			index1++
			continue
		}
		if nums1[index1] > nums2[index2] {
			pre = res
			res = float64(nums2[index2])
			index2++
		} else {
			pre = res
			res = float64(nums1[index1])
			index1++
		}
	}
	return (res + pre) / 2.0
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoaringW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值