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实现的石头剪子布代码分享
Aug 22 Python
python进程管理工具supervisor使用实例
Sep 17 Python
Python中获取网页状态码的两个方法
Nov 03 Python
深入浅出学习python装饰器
Sep 29 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
python中如何写类
Jun 29 Python
Python3合并两个有序数组代码实例
Aug 11 Python
实现Python3数组旋转的3种算法实例
Sep 16 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中的正规表达式(二)
2006/10/09 PHP
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
php英文单词统计器
2016/06/23 PHP
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
2019/05/01 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
导致python中import错误的原因是什么
2020/07/01 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
兼职业务员岗位职责
2014/01/01 职场文书
机关会计岗位职责
2014/04/08 职场文书
个人考核材料
2014/05/15 职场文书
总经理人事任命书
2014/06/05 职场文书
法学自荐信
2014/06/20 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
超市食品安全承诺书
2015/04/29 职场文书
新年晚会开场白
2015/05/29 职场文书
办公室卫生管理制度
2015/08/04 职场文书