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中获取对象信息的方法
Apr 27 Python
python类继承用法实例分析
May 27 Python
详谈Python基础之内置函数和递归
Jun 21 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
Python容器类型公共方法总结
Aug 19 Python
Python一些基本的图像操作和处理总结
Jun 23 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
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
node使用request请求的方法
2019/12/20 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
如何撰写岗位职责
2014/02/01 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
创先争优宣传标语
2014/10/08 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
python本地文件服务器实例教程
2021/05/02 Python