题目:https://leetcode.com/problems/median-of-two-sorted-arrays/

算法分析

这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个序列中,数值的大小处在(len(nums1)+len(nums2))/2位置的数。所以,这道题可以转换成,求解两个序列中,数值的大小处在第k位的数。这里用Nk表示要求的第k位数。

首先,我们分析两种简单的情况:

即两个序列中有一个序列为空,即len(nums1)==0 or len(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

代码实现

  1. class Solution(object):
  2. def findKth(self, a, m, b, n, k):
  3. if m > n:
  4. return self.findKth(b,n,a,m,k)
  5. if m == 0:
  6. return b[k-1]
  7. if k == 1:
  8. return min(a[0],b[0])
  9. pa = min(k/2, m)
  10. pb = k - pa
  11. if a[pa-1] < b[pb-1]:
  12. return self.findKth(a[pa:], m-pa, b, n, k-pa)
  13. elif a[pa-1] > b[pb-1]:
  14. return self.findKth(a, m, b[pb:], n-pb, k-pb)
  15. else:
  16. return a[pa-1]
  17. def findMedianSortedArrays(self, nums1, nums2):
  18. """
  19. :type nums1: List[int]
  20. :type nums2: List[int]
  21. :rtype: float
  22. """
  23. m = len(nums1)
  24. n = len(nums2)
  25. total = m + n
  26. if total & 1 == 1:
  27. return self.findKth(nums1, m, nums2, n, total/2 + 1)
  28. else:
  29. 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的更多相关文章

  1. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  2. [LintCode] Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  3. 2.Median of Two Sorted Arrays (两个排序数组的中位数)

    要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...

  4. 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)

    转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...

  5. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  6. No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...

  7. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  8. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  9. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

  10. LeetCode--No.004 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays Total Accepted: 104147 Total Submissions: 539044 Difficulty: Hard The ...

随机推荐

  1. Online Object Tracking: A Benchmark 翻译

    来自http://www.aichengxu.com/view/2426102 摘要 目标跟踪是计算机视觉大量应用中的重要组成部分之一.近年来,尽管在分享源码和数据集方面的努力已经取得了许多进展,开发 ...

  2. 报错:HTTP Status 404 - There is no Action mapped for namespace [/] and action name [product-save] associated with context path [/20161101-struts2-2].

    运行:index.jsp---->input.jsp----->details.jsp,但是在input.jsp到details.jsp的时候报错误. 异常如下: 严重: Could no ...

  3. VS2012打开解决方案崩溃或点击项目崩溃

    打开项目文件就VS2012就崩溃 解决方案: 步骤1:开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools-- ...

  4. duplicate symbols for architecture armv7解决办法

    XCODE编译的时候报错:duplicate symbols for architecture armv7   1.首先排查是否有名字重复的文件:   2.检查是否在#import头文件的时候,不小心 ...

  5. Electron实战:创建ELectron开发的window应用安装包

    前言:研究electron自动更新的时候,在electron的官方文档auto-updater 中,提到了在几个平台mac,Linux,windows下electron 的自动更新方法,其中winds ...

  6. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  7. Vs打包工程 错误: Unable to update the dependencies of the project (转)

    Setup Project 错误: Unable to update the dependencies of the project 在VS2010中编译包含安装工程的解决方案提示错误:Unable ...

  8. 前端项目构建error

    Refusing to install webpack as a dependency of itself 原因:package.json中,"name": "webpa ...

  9. skiplist

    §1 Skip List 介绍 Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间).基本上, 跳跃列表是对有序的链表增加上 ...

  10. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...