4. 两个排序数组的中位数

知乎ID: 码蹄疾
码蹄疾,毕业于哈尔滨工业大学。
小米广告第三代广告引擎的设计者、开发者;
负责小米应用商店、日历、开屏广告业务线研发;
主导小米广告引擎多个模块重构;
关注推荐、搜索、广告领域相关知识;

题目

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:

nums1 = [1, 3]
nums2 = [2]
中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5

分析

这个题主要是事件复杂度的问题,归并的做法就不用想了,o(m+n)的时间复杂度。看到log级别的肯定想到二分查找了,关键是怎么划分的问题,这也是本体的难点所在,校招可能会考那么难的题,社招这种题我肯定不会哪来面候选人,我自己现场也不一定做得出来。
首先,看中位数是啥?

中位数:将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。

首先,让我们在任一位置 i 将 A 划分成两个部分:

                left_A   |  right_A      
A[0], A[1], ..., A[i-1]  |  A[i], A[i+1], ..., A[m-1]

类似,

                     left_B  |  right_B      
    B[0], B[1], ..., B[j-1]  |  B[j], B[j+1], ..., B[n-1]

我们把A,B两个数组合并一下:

          left_part 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值