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 实现堆排序算法代码
Jun 05 Python
python实现爬虫下载漫画示例
Feb 16 Python
python使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
Python smtplib实现发送邮件功能
May 22 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
python实现共轭梯度法
Jul 03 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
Python实现屏幕录制功能的代码
Mar 02 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 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
phpmail类发送邮件函数代码
2012/02/20 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
Python 高级专用类方法的实例详解
2017/09/11 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python容器类型公共方法总结
2020/08/19 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
婚前协议书
2014/04/15 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python