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 Django模板的使用方法
Jan 14 Python
Python脚本实时处理log文件的方法
Nov 21 Python
django允许外部访问的实例讲解
May 14 Python
python实现简单flappy bird
Dec 24 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
基于Django实现日志记录报错信息
Dec 17 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 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
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
《寓言两则》教学反思
2014/02/27 职场文书
党员作风建设整改方案
2014/10/27 职场文书
论文答谢词
2015/01/20 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL