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练习程序批量修改文件名
Jan 16 Python
python连接mysql并提交mysql事务示例
Mar 05 Python
如何将python中的List转化成dictionary
Aug 15 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
Python从零开始创建区块链
Mar 06 Python
Python IDLE清空窗口的实例
Jun 25 Python
详解Django定时任务模块设计与实践
Jul 24 Python
对Django外键关系的描述
Jul 26 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
Python异常处理机制结构实例解析
Jul 23 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 Python
Python中time与datetime模块使用方法详解
Mar 31 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
Thinkphp微信公众号支付接口
2016/08/04 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
微信小程序实现侧边栏分类
2019/10/21 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
Python日期操作学习笔记
2008/10/07 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
C语言编程题
2015/03/09 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
移动通信专业自荐信范文
2013/11/12 职场文书
网络管理员岗位职责
2014/03/17 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
商场广播稿范文
2015/08/19 职场文书