要求: 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。演算法解析:例如:nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
中位數:將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素。**實現:1. 兩個有序的陣列分別為:a和b。其中a長度為m,b長度為n
我們把a分成兩部分:
left(a) | right(a)
a[0],a[1]...a[i-1] | a[i],a[i+2]...a[m-1]
其中len(left(a)) + len(right(a)) = m
把b分成兩部分:
left(b) | right(b)
b[0],b[1]...b[j-1] | b[j],b[j+2]...b[n-1]
其中len(left(b)) + len(right(b)) = n
2. 所以我們把兩個陣列結合到一起
left_part | right_part
left(a)+left(b) | right(a)+right(b)
其中:len(left_part) = i + j; len(right_part) = m-i+n-j
要找到ab兩個陣列的中位數,則需滿足:
len(left_part) == len(right_part);如果m+n總長度為奇數則這裡把多出的哪乙個元素放在左邊,所以len(left_part) == len(right_part)+1
max(left_part) <= min(right_part);由於陣列a和陣列b都是有序陣列,則需滿足a[i-1] <= b[j], b[j-1] <= a[i]
轉換成公式如下:
i+j = m-i+n-j+1
i+j = (m+n+1)/2
j = (m+n+1)/2 - i; 此時當i=m臨界值時,j = (n-m+1)/2, 所以n >= m
3. 先通過二分法方式定位陣列a中的乙個元素,再通過上面的公式也就能確定陣列b中的元素了
設imin := 0; imax := m,在[imin,imax]中進行搜尋
i = imin+imax / 2; 則 j = m+n+1+imin+imax / 2才能滿足len(left_part) == len(right_part)
此時我們已經滿足了len(left_part) == len(right_part)
下面需要滿足a[i-1] <= b[j]&& b[j-1] <= a[i]
但是我們會遇到不滿足的情況
比如:如果a[i-1] > b[j],則i需要減少,i和j是成反相關的,所以j就會增加,通過二分法,則i會向左邊分,i= i+imin / 2
如果b[j-1] > a[i],則j需要減少,i則需要增加,i會向右邊分, i = i + imax / 2
// findmediansortedarrays查詢兩個陣列的中位數
func findmediansortedarrays(a float64, b float64) float64
m := len(a)
n := len(b)
// 通過上面的分析,通過二分法先錨定a中的i
imin := 0
imax := m
for imin <= imax else if b[j-1] > a[i] && i < imax else else if j == 0 else
if (m+n)%2 == 1
// 找到右邊的最小值
rightmin := 0.0
if i == m else if j == n else
return (leftmax + rightmin) / 2
} }// 表示沒有找到
求兩個有序陣列的中位數
原部落格 設陣列a的長度為m,陣列b的長度為n,兩個陣列都都是遞增有序的。求這兩個陣列的中位數 首先我們看看中位數的特點,乙個大小為n的陣列,如果n是奇數,則中位數只有乙個,陣列中恰好有 n 1 2 個元素比中位數小。如果n是偶數,則中位數有兩個 下中位數和上中位數 這裡我們只求下中位數,對於下中位...
兩個有序陣列中位數
大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...
兩個有序陣列中位數
首先我們可以不斷分割得到這個kkk。首先兩個陣列都分配k 2 frac 2k 如果第k 2 frac 2k 個數,第乙個陣列小於第二個陣列,那麼第乙個陣列的k 2 frac 2k 個數一定不是答案。問題可以變成乙個子問題,上乙個陣列從k2 1 frac 1 2k 1開始。相當於我們每次要去掉k 2 ...