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中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python冲顶大会 快来答题!
Jan 17 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
python实现日志按天分割
Jul 22 Python
opencv3/C++图像像素操作详解
Dec 10 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
Jan 06 Python
python列表的逆序遍历实现
Apr 20 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 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 Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP多例模式介绍
2013/06/24 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
ant design实现圈选功能
2019/12/17 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
Exception类的常用方法
2012/06/16 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
搞笑爱情保证书
2014/04/29 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
个园导游词
2015/02/04 职场文书
中秋联欢会主持词
2015/07/04 职场文书
教务处干事工作总结
2015/08/14 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
阿里云日志过滤器配置日志服务
2022/04/09 Servers
Java实现简单小画板
2022/06/10 Java/Android