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的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
PyQt5每天必学之单行文本框
Apr 19 Python
django进阶之cookie和session的使用示例
Aug 17 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
python实现邮件发送功能
Aug 10 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
python statsmodel的使用
Dec 21 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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 发送带附件邮件示例
2014/01/23 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
js活用事件触发对象动作
2008/08/10 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
python解决网站的反爬虫策略总结
2016/10/26 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
《独坐敬亭山》教学反思
2014/04/08 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
出差报告格式模板
2014/11/06 职场文书
2014年终个人工作总结
2014/11/07 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
支教个人总结
2015/03/04 职场文书
奠基仪式致辞
2015/07/30 职场文书