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中用函数作为返回值和实现闭包的教程
Apr 27 Python
python实现按任意键继续执行程序
Dec 30 Python
python 自定义对象的打印方法
Jan 12 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
python中什么是面向对象
Jun 11 Python
基于keras中的回调函数用法说明
Jun 17 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
4种非常实用的python内置数据结构
Apr 28 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 for 循环语句使用方法详细说明
2010/05/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
浅谈MySQL中的触发器
2015/05/05 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
使用django实现一个代码发布系统
2019/07/18 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
英语自我评价范文
2014/01/24 职场文书
大学生个人求职信例文
2014/07/07 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
检讨书格式
2015/01/23 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Python之matplotlib绘制折线图
2022/04/13 Python