c++ 中位数算法_【每日编程138期】两个排序数组的中位数II

每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)

今日问题:

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n)) 。

你可以假设 nums1 和 nums2 不同时为空。

示例 1:

nums1 = [1,3]

nums2 = [2]

中位数是 2.0

示例 2:

nums1 = [1,2]

nums2 = [3,4]

中位数是 (2 + 3)/2= 2.5


解决方法:

暴力算法的改进算法:

不需要真正的合并两个数组,只需要找得到它的位置。

First:奇偶情况合并,如果是奇数,我们需要知道第 (len + 1)/2 个数就可以了,仅遍历 int ( len / 2 ) + 1 次。如果是偶数,我们需要知道第 len / 2 和 len / 2 + 1 个数,也是要遍历 len / 2 + 1 次。故综上奇偶数都需要遍历len / 2 + 1 次。

Second:我们用nums1Start和nums2Start分别表示当前指向nums1数组和nums2数组的位置。如果nums1Start没有遍历到最后并且当前nums1位置的数值小于nums2位置的数值,则向后遍历,nums1Start < m && num1[nums1Start] < nums2[nums2Start]。如果num2数组遍历完,而num1数组仍未结束,则会产生数组越界,则须判断num2Size是否大于数组长度,这样的话,||后面的就不用执行啦。即:num1Start < m && ( num2Start >= n|| num1 [ num1Start ] < num2 [ num2Start ] )。

Third:奇数返回最后一次遍历的结果,偶数则返回最后一次和上一次遍历结果的平均值。

C++代码:

d291275e5549cfb39d30af05424e4b84.png

C代码:

8480d1fcbd8d0cf2d47b6b92c1761d46.png

Java代码:

0187f926f10c30b7b350501506d5ee7c.png


明日题目预告:

两个排序数组的中位数III

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log(m+n)) 。

你可以假设 nums1 和 nums2 不同时为空。

示例 1:

nums1 = [1,3]

nums2 = [2]

中位数是 2.0

示例 2:

nums1 = [1,2]

nums2 = [3,4]

中位数是 (2 + 3)/2= 2.5

12a2ed877d723d0057d97db117989864.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值