Median of Two Sorted Arrays
2015-12-11 13:03
363 查看
题目:https://leetcode.com/problems/median-of-two-sorted-arrays/
首先,我们分析两种简单的情况:
即两个序列中有一个序列为空,即len(nums1)==0len(nums1) == 0 or len(nums2)==0len(nums2) == 0,这时的返回值为非空序列的第k位数,即nums1[k-1]或者nums2[k-1]
对于比较一般的情况,我们需要先计算两个序列的元素总个数,total=len(nums1)+len(nums2)total=len(nums1)+len(nums2),然后,进行奇偶性分析:
1. 如果totaltotal为奇数,则Nmedian=Ntotal+12N_{median}=N_\frac {total+1} {2}
2. 如果totaltotal为偶数,则Nmedian=(Ntotal2+Ntotal2+1)/2N_{median}=(N_\frac {total} {2} + N_{\frac {total} {2}+1})/2
下面,就要对第k位数进行查找,这里的查找思路是利用二分查找:
每次查找,就需要对两个序列中的其中一个,去除k/2个数,所以,我们只需要比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小,如果前者大,就将Nums2中的前k/2个数去除,即第k位的数,一定不在Nums2的前k/2中。将Nums2的前k/2个数去除之后,问题就变成了从余下的元素中,寻找第k-k/2位数。
上述的查找思路,还需要考虑当Nums2的元素个数小于k/2时,就只能去除len(nums2)个数。即问题就变成了,在Nums1中寻找第k-len(nums2)位置的数。
在比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小时,如果两者相等,则第k位置的数,就是Nums1k/2Nums1_{k/2}或Nums2k/2Nums2_{k/2}
算法分析
这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个序列中,数值的大小处在(len(nums1)+len(nums2))/2位置的数。所以,这道题可以转换成,求解两个序列中,数值的大小处在第k位的数。这里用NkN_k表示要求的第k位数。首先,我们分析两种简单的情况:
即两个序列中有一个序列为空,即len(nums1)==0len(nums1) == 0 or len(nums2)==0len(nums2) == 0,这时的返回值为非空序列的第k位数,即nums1[k-1]或者nums2[k-1]
对于比较一般的情况,我们需要先计算两个序列的元素总个数,total=len(nums1)+len(nums2)total=len(nums1)+len(nums2),然后,进行奇偶性分析:
1. 如果totaltotal为奇数,则Nmedian=Ntotal+12N_{median}=N_\frac {total+1} {2}
2. 如果totaltotal为偶数,则Nmedian=(Ntotal2+Ntotal2+1)/2N_{median}=(N_\frac {total} {2} + N_{\frac {total} {2}+1})/2
下面,就要对第k位数进行查找,这里的查找思路是利用二分查找:
每次查找,就需要对两个序列中的其中一个,去除k/2个数,所以,我们只需要比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小,如果前者大,就将Nums2中的前k/2个数去除,即第k位的数,一定不在Nums2的前k/2中。将Nums2的前k/2个数去除之后,问题就变成了从余下的元素中,寻找第k-k/2位数。
上述的查找思路,还需要考虑当Nums2的元素个数小于k/2时,就只能去除len(nums2)个数。即问题就变成了,在Nums1中寻找第k-len(nums2)位置的数。
在比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小时,如果两者相等,则第k位置的数,就是Nums1k/2Nums1_{k/2}或Nums2k/2Nums2_{k/2}
代码实现
class Solution(object): def findKth(self, a, m, b, n, k): if m > n: return self.findKth(b,n,a,m,k) if m == 0: return b[k-1] if k == 1: return min(a[0],b[0]) pa = min(k/2, m) pb = k - pa if a[pa-1] < b[pb-1]: return self.findKth(a[pa:], m-pa, b, n, k-pa) elif a[pa-1] > b[pb-1]: return self.findKth(a, m, b[pb:], n-pb, k-pb) else: return a[pa-1] def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ m = len(nums1) n = len(nums2) total = m + n if total & 1 == 1: return self.findKth(nums1, m, nums2, n, total/2 + 1) else: return (self.findKth(nums1, m, nums2, n, total/2) + self.findKth(nums1, m, nums2, n, total/2+1))/2.0
相关文章推荐
- 集合元素重复问题
- Scala:object(单例)
- IE、FireFox、Chrome浏览器的全屏实现
- 两数之和
- 三数之和 II——LintCode
- Count Primes
- SPOJ COT Count on a tree
- APP原型设计工具,哪家强?转自知乎
- Cocos2d-x 脚本语言Lua基本语法
- 三数之和——LintCode
- rails 4 里面 用 link_to 来生成 delete调用,
- 十大编程算法助程序员走上高手之路
- Centos查看端口占用情况和开启端口命令
- Hadoop教程(四):理解MapReduce、MapReduce计数器和连接、MapReduce Hadoop程序连接数据
- MyEclipse提示注册码MyEclipse Trial Expired解决方案
- 派生类到基类的转换 和基类到派生类的转换
- linux硬链接与软链接
- Gson解析内存溢出
- 凸包 Codeforces605C Freelancer's Dreams
- Android学习笔记(15):网格布局GridLayout