二分查找O(log(min(m,n)))解决两个有序数组求中位数

本文介绍了如何利用二分查找算法在O(log(min(m,n)))的时间复杂度内解决两个有序数组求中位数的问题。通过分析数组切点、分治思想和特殊情况进行讨论,给出详细的解题步骤和代码实现。" 131990326,7337247,深入解析Redux:源码剖析与运行原理,"['前端开发', 'React', 'Redux', '编程实践', '架构设计']
摘要由CSDN通过智能技术生成

题目解析:
  这个题目简单来说就是如果将两个已经排序的数组合并为一个虚拟数组,求出这个虚拟数组的中位数即可。

解题思路:
  1、这道题最主要的就是切(cut),怎么将数组切成合适的两段是关键,对于一个数组来说在数组的中间将其切成两段,这时候就要分情况讨论,如果是偶数个,中位数就是切点的两边第一个数的平均值,如果是奇数个,中位数就是切点右边的第一个数,比如说1 2 3 4 5,在中间的位置将这个数组切成两段:1 2 \ 3 4 5,很显然,中位数就是3,如果是1 2 3 4,那么就切成了1 2 \ 3 4,很显然中位数就是(2+3)/2 = 2.5。
  2、理解了切的思想,接下来就开始在两个数组中进行切,这时候就用到了分治思想。
  怎么分?
  题目中要求的时间复杂度为 O(log(m + n)),很容易想到的方法就是二分,现在有两个数组,要对那个数组进行二分合适?由于找的是中位数,那么这个数字的两边的元素个数是相等的,所以只需要确定一个数组中的两边元素,两一个数组的对应的补上去就可以了,为了提高效率,要选择最短的数组做二分查找。
  怎么治?
  这个也很容易,只需要分别比较两个数组切点两边的数就可以,假设数组一中切点两边的元素为L1,R1,数组二中切点两边的元素为:L2,R2,切完之后有三种情况:
  1)L1>R2 ,说明数组一的左半边比数组二的右半边大,应该让cut向左移,才能使数组一中较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值