Median of Two Sorted Arrays
来源:互联网 发布:淘宝手表正品店 编辑:程序博客网 时间:2024/06/16 07:31
题目:https://leetcode.com/problems/median-of-two-sorted-arrays/
算法分析
这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个序列中,数值的大小处在(len(nums1)+len(nums2))/2位置的数。所以,这道题可以转换成,求解两个序列中,数值的大小处在第k位的数。这里用
Nk 表示要求的第k位数。
首先,我们分析两种简单的情况:
即两个序列中有一个序列为空,即len(nums1)==0 orlen(nums2)==0 ,这时的返回值为非空序列的第k位数,即nums1[k-1]或者nums2[k-1]
对于比较一般的情况,我们需要先计算两个序列的元素总个数,total=len(nums1)+len(nums2) ,然后,进行奇偶性分析:
1. 如果total 为奇数,则Nmedian=Ntotal+12
2. 如果total 为偶数,则Nmedian=(Ntotal2+Ntotal2+1)/2
下面,就要对第k位数进行查找,这里的查找思路是利用二分查找:
每次查找,就需要对两个序列中的其中一个,去除k/2个数,所以,我们只需要比较Nums1k/2 和Nums2k/2 的大小,如果前者大,就将Nums2中的前k/2个数去除,即第k位的数,一定不在Nums2的前k/2中。将Nums2的前k/2个数去除之后,问题就变成了从余下的元素中,寻找第k-k/2位数。
上述的查找思路,还需要考虑当Nums2的元素个数小于k/2时,就只能去除len(nums2)个数。即问题就变成了,在Nums1中寻找第k-len(nums2)位置的数。
在比较Nums1k/2 和Nums2k/2 的大小时,如果两者相等,则第k位置的数,就是Nums1k/2 或Nums2k/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
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of two sorted arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- median-of-two-sorted-arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- 用shell批量修改文件名
- java学习总结之多线程
- Android bluetooth介绍(一):基本概念及硬件接口
- zookeeper的Will not attempt to authenticate using SASL (无法定位登录配置)
- leetcode -- Reverse Words in a String -- 太简单,忽略
- Median of Two Sorted Arrays
- 【转】opencv+vs2013+cmake生成源码
- 正则表达式-理论基础篇
- Android所有权限说明
- How to use USB to do charger detection instead of PMIC?
- 设计模式之装饰者模式
- cocoapods的牢骚
- POJ 3104 Drying(二分搜索,最大化最小值)
- 杭电4883-TIANKENG’s restaurant(区间覆盖)