leetcode.5 寻找两个正序数组的中位数

这是一篇关于LeetCode第5题的解决方案,主要讨论如何在O(log(m + n))的时间复杂度内找到两个正序数组的中位数。通过二分递归的方法,先确定第k个元素,再根据数组长度和元素比较找到中位数。即使数组元素个数为奇数或偶数,中位数也可以通过计算第(m + n + 1)/2和(m + n + 2)/2个元素的平均值得到。
摘要由CSDN通过智能技术生成

4. 寻找两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

 

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

首先想到的算法是一个i扫描nums1, 一个j扫描nums2, 两面总共扫描(m + n)/ 2次就好

但那个算法复杂度是 O(m + n)的

再看题目要求是O(log(m + n)), 一定是二分递规

 

这里我们定义一个递归函数来求两个数组的第k个元素

如果k = 1, 那么肯定是两个数组的第一个数中的较小的那个

其他情况呢

两个数组都找第 k / 2 个元素

如果某一个数组长度小于 k / 2 , 那第k个元素肯定在另一个数组中

比较两个数组的第 k / 2 个元素,较小的那个的数组前 k / 2个元素中是肯定找不到了

然后在他剩下的部分和另一个数组中找第k - k / 2 个元素

这样就二分递归找到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值