Python寻找两个有序数组的中位数实例详解

 更新时间:2018年12月05日 10:17:29   作者:A_foreignwuli  
这篇文章主要介绍了Python寻找两个有序数组的中位数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

Python寻找两个有序数组的中位数

审题:

1.找出意味着这是一个查找算法题

2.算法复杂度log级别,就是提示你是二分查找

3.二分查找实现一般为递归

 (1)递归包括递归体
 (2)终止条件

思路:

定理:

1.有序数组中有一半的元素小于等于数组的中位数,有一半的元素大于等于中位数(如果数组中元素个数是奇数,那么这里的一半并不是严格意义的1/2)

2.如果我们去掉其中一个数组比中位数小的k个数,再去掉另一个数组中比中位数大的k个数,得到的合并子数组的中位数和原来的中位数相同。

eg:[1,2,3],[1,2,3] => [1,1,2,2,3,3]

根据定理去除元素[2,3],[1,2] => [1,2,2,3]中位数没变。我用了特殊的例子解释,你可以自行换一个试一试。如果两个的数组长度不一样的时候,不能去掉各自的一半,要去掉相同的个数,下面会细说

解题思路:

假设两个数组的中位数分别是a[m1],b[m2]

1.if a[m1] == b[m2] ,那么刚好有一半的元素小于a[m1],那么a[m1]就是要找的中位数。参考上面的列子

2.if a[m1] < b[m2],根据定理1可知,这个中位数只可能出现在a[n1/2 ~ n1-1]或者b[0 ~ n2/2].也就是说合并这两个数组的中位数和原来的数组合并的数组的中位数是一样的。 根据定理2可知:

1.数组长度一样的时候,去除掉一半是合理的。

2.数组长度不一样,这么做中位数可能发生变化。解决方案就是去除掉相同个数的元素。why?假设n1 < n2, 两个数组就去掉n1/2个元素。那就不在是上面的范围(a[n1/2 ~ n1-1]或者b[0 ~ n2/2]),而是a[n1/2 ~ n1-1]或者b[0 ~ (-n1/2+n2-1)].

结论就是:只能删除a的n1/2(向下取整)

3.if a[m1] > b[m2],和上面分析类似,中位数只能出现在a的前半段或者b的后半段。也就是说a[0 ~ n1/2]和b[n1/2 ~ n2-1]的中位数和原来的中位数相同。

参考:LeetCode参考答案

class Solution:
  def findMedianSortedArrays(self, nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: float
    """
    m, n = len(nums1), len(nums2)
    if m > n:
      nums1, nums2, m, n = nums2, nums1, n, m
    if n == 0:
      raise ValueError
    imin, imax, half_len = 0, m, (m + n + 1) // 2
    while imin <= imax:
      i = (imin + imax) // 2
      j = half_len - i
      if i < m and nums2[j-1] > nums1[i]:
        # i is too small, must increase it
        imin = i + 1
      elif i > 0 and nums1[i-1] > nums2[j]:
        # i is too big, must decrease it
        imax = i - 1
      else:
        # i is perfect
        if i == 0: max_of_left = nums2[j-1]
        elif j == 0: max_of_left = nums1[i-1]
        else: max_of_left = max(nums1[i-1], nums2[j-1])
        if (m + n) % 2 == 1:
          return max_of_left
        if i == m: min_of_right = nums2[j]
        elif j == n: min_of_right = nums1[i]
        else: min_of_right = min(nums1[i], nums2[j])
        return (max_of_left + min_of_right) / 2.0

总结

以上所述是小编给大家介绍的Python寻找两个有序数组的中位数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • matplotlib更改窗口图标的方法示例

    matplotlib更改窗口图标的方法示例

    这篇文章主要介绍了matplotlib更改窗口图标的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 如何基于python实现年会抽奖工具

    如何基于python实现年会抽奖工具

    这篇文章主要介绍了如何基于python实现年会抽奖工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Python itertools库高效迭代艺术实例探索

    Python itertools库高效迭代艺术实例探索

    Python 中的 itertools 库为迭代器操作提供了丰富的工具集,使得处理迭代对象变得更加高效和灵活,本篇文章将深入讨itertools库的常用方法,通过详实的示例代码演示其在解决各种问题中的应用
    2024-01-01
  • 详解Python下载图片并保存本地的两种方式

    详解Python下载图片并保存本地的两种方式

    这篇文章主要介绍了Python下载图片并保存本地的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Python中使用MySQL模糊查询的详细方法

    Python中使用MySQL模糊查询的详细方法

    这篇文章主要介绍了Python中使用MySQL模糊查询的方法,以下是一个使用pymysql进行模糊查询的详细示例,包括安装库、连接数据库、执行查询以及处理结果,需要的朋友可以参考下
    2024-06-06
  • Python利用手势识别实现贪吃蛇游戏

    Python利用手势识别实现贪吃蛇游戏

    想必大家都玩过贪吃蛇的游戏吧:通过操纵蛇的移动方向能够让蛇吃到随机出现的食物,吃到的食物越多,蛇就会变得越长。本文将使用手势识别来完成贪吃蛇这个简单的游戏,感兴趣的可以了解一下
    2022-04-04
  • 在Spyder中如何导入项目

    在Spyder中如何导入项目

    文章介绍了在Spyder中导入已存在项目时遇到的错误及解决方法,通过创建新项目并复制`.spyproject`文件夹到已存在项目中,可以成功导入项目,此外,还提到如何在Spyder中显示项目资源管理器
    2025-01-01
  • python 中值滤波,椒盐去噪,图片增强实例

    python 中值滤波,椒盐去噪,图片增强实例

    今天小编就为大家分享一篇python 中值滤波,椒盐去噪,图片增强实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python模块 _winreg操作注册表

    Python模块 _winreg操作注册表

    通过python操作注册表主要有两种方式,一种是通过python的内置模块 _winreg,另一种方式就是 Win32 Extension For Python的win32api模块,这里主要简单看看用内置模块 _winreg如何操作注册表
    2020-02-02
  • Python代码显得Pythonic(区别于其他语言的写法)

    Python代码显得Pythonic(区别于其他语言的写法)

    这篇文章主要介绍了Python代码显得Pythonic(区别于其他语言的写法),对于字符串连接,相比于简单的+,更pythonic的做法是尽量使用%操作符或者format函数格式化字符串,感兴趣的小伙伴和小编一起进入文章了解更详细相关知识内容吧
    2022-02-02

最新评论