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