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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
儿童编程python入门
May 08 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
python入门之基础语法学习笔记
Feb 08 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
python中return不返回值的问题解析
Jul 22 Python
Python各协议下socket黏包问题原理
Apr 12 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的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
php实现的通用图片处理类
2015/03/24 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
JS提交form表单实例分析
2015/12/10 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
python处理csv数据的方法
2015/03/11 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
python中property和setter装饰器用法
2019/12/19 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
交通事故协议书范文
2014/04/16 职场文书
实习推荐信
2014/05/10 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
防卫过当辩护词
2015/05/21 职场文书
未婚证明格式
2015/06/15 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
JavaScript函数柯里化
2021/11/07 Javascript
MySQL创建管理RANGE分区
2022/04/13 MySQL