4 尋找兩個有序陣列的中位數

2021-10-02 13:25:05 字數 2777 閱讀 7164

給定兩個大小為 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

為了解決這個問題,我們需要理解 「中位數的作用是什麼」。在統計中,中位數被用來:

將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素。

所以我們只需要將陣列進行切割。

乙個長度為 m 的陣列,有 0 到 m 總共 m + 1 個位置可以切割。

我們把陣列 a 和陣列 b 分別在 i 和 j 進行切割。

將 i 的左邊和 j 的左邊組合成「左半部分」,將 i 的右邊和 j 的右邊組合成「右半部分」。

左半部分的長度等於右半部分

i + j = m - i  + n - j  , 也就是 j = ( m + n ) / 2 - i
左半部分最大的值小於等於右半部分最小的值 max ( a [ i - 1 ] , b [ j - 1 ])) <= min ( a [ i ] , b [ j ]))

那麼,中位數就可以表示如下

(左半部分最大值 + 右半部分最小值 )/ 2。

(max ( a [ i - 1 ] , b [ j - 1 ])+ min ( a [ i ] , b [ j ])) / 2

左半部分的長度比右半部分大 1

i + j = m - i  + n - j  + 1也就是 j = ( m + n + 1) / 2 - i
左半部分最大的值小於等於右半部分最小的值 max ( a [ i - 1 ] , b [ j - 1 ])) <= min ( a [ i ] , b [ j ]))

那麼,中位數就是

左半部分最大值,也就是左半部比右半部分多出的那乙個數。

max ( a [ i - 1 ] , b [ j - 1 ])

上邊的第乙個條件我們其實可以合併為j = ( m + n + 1) / 2 - i,因為如果m + n是偶數,由於我們取的是 int 值,所以加 1 也不會影響結果。當然,由於0 <= i <= m,為了保證0 <= j <= n,我們必須保證m <= n

m≤n, i(m+m+1)/2−m=0

m≤n, i>0, j=(m+n+1)/2−i≤(n+n+1)/2−i

最後一步由於是 int 間的運算,所以 1/2=0。

而對於第二個條件,奇數和偶數的情況是一樣的,我們進一步分析。為了保證max ( a [ i - 1 ] , b [ j - 1 ])) <= min ( a [ i ] , b [ j ])),因為 a 陣列和 b 陣列是有序的,所以a [ i - 1 ] <= a [ i ]b [ i - 1 ] <= b [ i ]這是天然的,所以我們只需要保證b [ j - 1 ] < = a [ i ]a [ i - 1 ] <= b [ j ]所以我們分兩種情況討論:

此時和上邊的情況相反,我們要減少 i ,增大 j 。

上邊兩種情況,我們把邊界都排除了,需要單獨討論。

所有的思路都理清了,最後乙個問題,增加 i 的方式。當然用二分了。初始化 i 為中間的值,然後減半找中間的,減半找中間的,減半找中間的直到答案。

class

solution

int imin =

0, imax = m;

while

(imin <= imax)

else

if(i !=

0&& j != n && a[i-1]

> b[j]

)else

else

if(j ==0)

elseif(

(m + n)%2

==1)// 奇數的話不需要考慮右半部分

int minright =0;

//右半部分最小值

if(i == m)

else

if(j == n)

else

return

(maxleft + minright)

/2.0

;//如果是偶數的話返回結果}}

return

0.0;

}}

4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

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 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 nums2 3...