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


Posted in Python onDecember 05, 2018

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寻找两个有序数组的中位数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中字符编码简介、方法及使用建议
Jan 08 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python爬虫 模拟登录人人网过程解析
Jul 31 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
Python decorator拦截器代码实例解析
Apr 04 Python
python中判断文件结束符的具体方法
Aug 04 Python
Python极值整数的边界探讨分析
Sep 15 Python
Pygame Event事件模块的详细示例
Nov 17 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 #Python
python批量下载网站马拉松照片的完整步骤
Dec 05 #Python
解决python3中cv2读取中文路径的问题
Dec 05 #Python
利用Python求阴影部分的面积实例代码
Dec 05 #Python
python之cv2与图像的载入、显示和保存实例
Dec 05 #Python
python存储16bit和32bit图像的实例
Dec 05 #Python
Python随机生成身份证号码及校验功能
Dec 04 #Python
You might like
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
2018/10/22 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
中专生学习生活的自我评价分享
2013/10/27 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
三好学生评语大全
2014/12/29 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android