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实现图片转字符画的示例
Aug 22 Python
python写入已存在的excel数据实例
May 03 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
Python实现图像的垂直投影示例
Jan 17 Python
Python自动化测试笔试面试题精选
Mar 12 Python
Python实现动态循环输出文字功能
May 07 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
pytorch实现查看当前学习率
Jun 24 Python
详解python变量与数据类型
Aug 25 Python
python 自动刷新网页的两种方法
Apr 20 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP数组函数知识汇总
2016/05/12 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
js实现文字无缝向上滚动
2017/02/16 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
python 中split 和 strip的实例详解
2017/07/12 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
python里反向传播算法详解
2020/11/22 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
Hibernate持久层技术
2013/12/16 面试题
在校大学生个人的自我评价
2014/02/13 职场文书
《乌塔》教学反思
2014/02/17 职场文书
委托公证书
2014/04/08 职场文书
股份转让协议书
2014/04/12 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
乡镇三严三实学习心得体会
2014/10/13 职场文书
2014年网管工作总结
2014/12/11 职场文书
法人身份证明书
2015/06/18 职场文书
运动员代表致辞
2015/07/29 职场文书
给学校的建议书400字
2015/09/14 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL