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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
python之Socket网络编程详解
Sep 29 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
Python基础教程之输入输出和运算符
Jul 26 Python
pycharm实现猜数游戏
Dec 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
我的论坛源代码(一)
2006/10/09 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
jquery+html仿翻页相册功能
2016/12/20 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
橄榄树药房:OLIVEDA
2019/09/01 全球购物
高中军训感言200字
2014/02/23 职场文书
调研汇报材料范文
2014/08/17 职场文书
委托书怎样写
2014/08/30 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
详解Oracle块修改跟踪功能
2021/11/07 Oracle
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python