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模块restful使用方法实例
Dec 10 Python
详解Python中的多线程编程
Apr 09 Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
python线程、进程和协程详解
Jul 19 Python
python paramiko模块学习分享
Aug 23 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
python实现处理mysql结果输出方式
Apr 09 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
如何用用Python将地址标记在地图上
Feb 07 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 Google的translate API代码
2008/12/10 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
二招解决php乱码问题
2012/03/25 PHP
php cli 小技巧
2013/06/03 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
新手入门常用代码集锦
2007/01/11 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
Python常用的json标准库
2019/02/19 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Python tkinter模版代码实例
2020/02/05 Python
pycharm快捷键汇总
2020/02/14 Python
python中xlutils库用法浅析
2020/12/29 Python
手术室护士自我鉴定
2013/10/14 职场文书
和平主题的演讲稿
2014/01/12 职场文书
大学毕业感言一句话
2014/02/06 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
团队拓展训练感想
2015/08/07 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL