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]的中位数和原来的中位数相同。

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寻找两个有序数组的中位数实例详解相关推荐

  1. 怎样在两个局域网内共享一台打印机 。常用网络命令及命令实例详解

    怎样在两个局域网内共享一台打印机 怎样在两个局域网内共享一台打印机 我们公司有两间办公室,原先布线的时候用一个路由器延伸出多个接口预埋在墙里并做上插头,IP地址是自动分配的,网关是192.168.0. ...

  2. c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解

    C语言 经典题目螺旋矩阵 实例详解 C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include #include int main() { int N,i,j,n,num=1; int a[10][ ...

  3. python画二维散点图-基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71 ...

  4. watch深度监听数组_vue watch普通监听和深度监听实例详解(数组和对象)

    vue watch普通监听和深度监听实例详解(数组和对象) 下面通过一段代码给大家介绍vue watch的普通监听和深度监听,具体代码如下所示: var vm=new Vue({ data:{ num ...

  5. python随机生成二维列表_对python产生随机的二维数组实例详解

    对python产生随机的二维数组实例详解 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果.最后在一篇博客中受到启发,通过列 ...

  6. android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  7. python画二维数组散点图_基于python二维数组及画图的实例详解

    基于python二维数组及画图的实例详解 下面小编就为大家分享一篇基于python 二维数组及画图的实例详解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.二维数组取值 注:不管 ...

  8. java生成字符串数组_Java 生成随机字符串数组的实例详解

    Java 生成随机字符串数组的实例详解 利用Collections.sort()方法对泛型为String的List 进行排序.具体要求: 1.创建完List之后,往其中添加十条随机字符串 2.每条字符 ...

  9. python的对象数组_Python当中的array数组对象实例详解

    计算机为数组分配一段连续的内存,从而支持对数组随机访问: 由于项的地址在编号上是连续的,数组某一项的地址可以通过将两个值相加得出,即将数组的基本地址和项的偏移地址相加. 数组的基本地址就是数组的第一项 ...

最新文章

  1. 邮件客户端WebMail Pro v7.7.5发布,在线订购限时75折优惠!
  2. 编程计算1+2+3+4+...+n的值超过500的和的第一个值
  3. 语音公司集体杀入AI芯片 2019场景落地战打响!
  4. 《python数据分析实战》第七章手写
  5. idea中配置xml不自动提示解决方案
  6. 修复Chrome上的ERR_TOO_MANY_REDIRECTS错误?
  7. vue 页面A转到页面B,B页面停留在A页面的滚动位置
  8. 获取表单内部元素的N种方法
  9. INFO:InstallShield InstallScript工程中自定义界面文本输入控件的两个注意事项
  10. Kira同学:斩获百度校招提前批offer备战细节全揭秘
  11. 超链接禁用_在Microsoft Word 2003和2007中禁用自动超链接
  12. 计算机网络协议的特点,计算机网络传输层协议类型与特点
  13. #6278. 数列分块入门 2
  14. [Python] L1-024. 后天-PAT团体程序设计天梯赛GPLT
  15. web前端开发做项目,CSS盒子模型居中方法
  16. linux 图片压缩命令,Linux:优化和压缩JPEG和PNG图片的命令行工具
  17. python取出一组数中的奇偶数
  18. 【iMessage苹果推信家庭推】位置推通过苹果实现iMessage群发的Apple script脚本代码如下: tell application “Messages” set csvDatator
  19. 地下通信管道的管孔都快占满了,新增光缆怎么布放?
  20. Python移动自动化测试面试准备

热门文章

  1. 网页前端套java数据_【java】网页/移动前端需要的数据,最好一个接口包含所有数据么?...
  2. python计算2的平方代码_python – NumPy计算向量的范数2的平方
  3. android透明视频教程,安卓透明教程(Android transparent tutorial).doc
  4. 学python好还是不学好_非专业人士有必要学Python吗?
  5. Python函数中4种参数的使用
  6. Python中国际化(i18n)完整指南
  7. Python隐藏属性
  8. java创建线程代码_Java创建与结束线程代码示例
  9. python中递归函数特点,Python递归函数特点及原理解析
  10. JSON文件学习(jsonc、json-c)(不要学这个,去学cJSON)