求兩個有序陣列的中位數

2021-10-01 04:14:26 字數 2205 閱讀 5320

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