[LC]4.寻找两个正序数组的中位数
题目
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
分析
暴力解
直接归并两个有序数组,然后求中位数即可
时间复杂度 :$O(m+n)$
二分查找
先考虑更一般的问题,找第$k$小的数。
为了找到第$k$小的数,先考虑$A[k/2 - 1]$和$B[k/2 - 1]$,这分为三种情况:
$A[k/2 - 1] < B[k/2 - 1]$ :
$命题:A[0,1,…,k/2-1]中的数不会是第k小的数$
$证明:A[k/2 - 1]是A[0,1,…,k/2-1]中最大的数,$
$而A[k/2-1]之前最多有k/2-1+k/2-1 = k-2个元素,$
$因此A[k/2-1]至多是第k-1小的元素.$
因此,对于此种情况,我们丢弃$A[0,1,…,k/2-1]$中的元素,并相应的更新$k$,求解一个规模更小的子问题.
$A[k/2 - 1] > B[k / 2 -1]$
同理,对于此种情况,我们丢弃$B[0,1,…,k/2-1]$中的元素,并相应的更新$k$.
$A[k/2-1] = B[k/2 -1]$
该情况可以并入情况1.
需要注意的是,我们必须考虑当$k/2-1$越界的情况,此时我们取数组最后一个元素即可,更新$k$的时候要相应的修改。
当$k=1$的时候,我们只需要返回两个数组首元素中的较小者即可。
代码
1 |
|
时间复杂度:
因为每次$k$都会减少一半,所以时间复杂度为$O(logk) = O(log(m+n)).$
[LC]4.寻找两个正序数组的中位数
https://erlsrnby04.github.io/2024/10/05/LC-4-寻找两个正序数组的中位数/