算法-寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
这道题要求找出两个已排序数组的中位数,且算法的时间复杂度应为 O(log(m+n))。其中,O 表示时间复杂度的上限,log 表示对数,m 和 n 分别表示两个数组的大小。
我们可以使用二分查找算法来解决这个问题。首先,我们将两个数组分别记为 nums1 和 nums2。为了方便,我们假设 nums1 的长度小于等于 nums2 的长度。
我们可以在 nums1 中选取一个位置 i,在 nums2 中选取一个位置 j,使得 i+j=(m+n+1)/2,其中 m 和 n 分别是两个数组的长度。如果我们能够保证:
nums1[i-1] <= nums2[j] 且 nums2[j-1] <= nums1[i]
那么,我们就已经将 nums1 和 nums2 分成了两个部分,且第一部分中的所有元素都小于第二部分中的所有元素。此时,中位数即为:
当 m+n 为奇数时,中位数为 max(nums1[i-1],nums2[j-1]); 当 m+n 为偶数时,中位数为 (max(nums1[i-1],nums2[j-1])+min(nums1[i],nums2[j]))/2。
为了保证上述条件成立,我们可以使用二分查找算法在 [0, m] 中查找合适的 i 值。在每次二分查找时,我们可以计算出 j 的值,然后检查上述条件是否成立。如果成立,则返回中位数;否则,我们就需要调整 i 的值,以便满足上述条件。具体地,如果 nums1[i-1] > nums2[j-1],则我们需要将 i 的值减小,否则将 i 的值增大。时间复杂度为 O(log(min(m,n)))。
下面是代码实现:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
m, n = len(nums1), len(nums2)
left, right = 0, m
while left <= right:
i = (left + right) // 2
j = (m + n + 1) // 2 - i
if i < m and nums2[j-1] > nums1[i]:
left = i + 1
elif i > 0 and nums1[i-1] > nums2[j]:
right = i - 1
else:
if i == 0:
max_left = nums2[j-1]
elif j == 0:
max_left = nums1[i-1]
else:
max_left = max(nums1[i-1], nums2[j-1])
if (m + n) % 2 == 1:
return max_left
if i == m:
min_right = nums2[j]
elif j == n:
min_right = nums1[i]
else:
min_right = min(nums1[i], nums2[j])
return (max_left + min_right) / 2
相关文章
- 从零开始学Pytorch(十四)之优化算法进阶
- 【算法】分治思想、动态规划、回溯、贪心算法
- 日拱算法:环形数组是否存在循环
- 日拱算法:删除有序数组中的重复项
- Topk算法_topn算法
- 剑指 Offer 03. 数组中重复的数字(原地算法)「建议收藏」
- 算法与数据结构之最大/最小堆
- JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]
- 单调栈总结_进栈和出栈的算法思想
- 声源定位方法_声源定位算法
- 【算法基础】数组反转
- 广告行业中那些趣事系列60:详解超好用的无监督关键词提取算法Keybert
- MATLAB数据挖掘用改进的K-Means(K-均值)聚类算法分析高校学生的期末考试成绩数据
- 「Facebook吹哨人」给马斯克指了条明路:推特算法必须开源
- BAT面试算法进阶(8)- 删除排序数组中的重复项
- Java数据结构和算法(二)——数组详解编程语言
- 算法-旋转数组的最小数字详解编程语言
- 算法-二维数组中的查找详解编程语言
- 删除排序数组中的重复项算法详解编程语言
- 数组倒序排列,数组倒置,C语言数组倒序算法详解
- 触景无限肖洪波:9年创业,从算法到芯片,只为前端感知
- php不用内置函数对数组排序的两个算法代码
- js算法中的排序、数组去重详细概述
- Java实现快速排序算法(Quicktsort)
- php生成数组的使用示例php全组合算法
- C语言实现排序算法之归并排序详解