兩個排序陣列合併第k或前k個最小值問題

2021-06-19 08:41:28 字數 2204 閱讀 7110

求最小一般用二分,求前最小一般用堆

偶爾看到乙個問題,搜尋了一些解法,用來存著

1.x[1..n] 和 y[1..n]為兩個陣列,每個都包含n個已排好序的數。給出乙個求陣列x和y中所有2n個元素的中位數的o(lgn)時間的演算法

分析與解答:

若中位數字於x中,不妨設為x[k],即在x中有k個元素小於等於中位數,n-k個元素大於等於中位數。由於x[k]為合併後的2n個元素的中位數,則在y中有n-k個元素小於等於中位數,k個元素大於等於中位數,即

y[n-k] ≤  x[k] ≤ y[n-k+1]

看到時間複雜度為o(lgn),不禁使我們想到二分法,但是和這題有什麼關聯呢?

二分法每次搜尋都能減小一半的範圍,在搜尋中位數的過程也可以的,下面具體論述:

若x[k]不滿足上述等式,分兩種情況

(1) x[k] < y[n-k]

若中位數是k' < k,則x[k'] ≤  x[k]] < y[n-k] 。那麼在y中小於等於x[k']的元素數目小於n-k,則x[k']不可能為中位數

由此只需要搜尋k' > k的範圍

(2) x[k] > y[n-k+1]

若中位數是k' >  k,則x[k'] > x[k] > y[n-k+1] 。那麼在y中小於等於x[k']的元素數目大於n-k+1,則x[k']不可能為中位數

由此只需要搜尋k' < k的範圍

根據上述特點,我們可以採用二分搜尋逐步縮小搜尋範圍。

整個演算法的過程如下:

two-array-median(x, y)

n ← length[x]

median ← find-median(x, y, n, 1, n)

if median = not-found

then median ← find-median(y, x, n, 1, n)

return median

find-median(a, b, n, low, high)

if low > high

then return not-found

k ← (low + high)/2

if k=n and a[n] ≤ b[1]

then return a[n]

elseif k2.假設a[m], b[n]是兩個排好序的陣列,並且沒有重複元素,要找第k小的元素

參考:

裡面有一種方法挺好的,o(lgk)

為了方便以下描述下標從1開始,

如果m,n>=k時,若k為偶數取i=k/2,j=k/2,若k為奇數,乙個向下去整乙個向上去整。如果兩個值相同,則第k小的就是此值;如果此時一大一小,假設a[i]>b[j],則i--,j++(0

如果m,n

3.兩個按公升序排好的等長陣列a[k],b[k]。a[i]+b[j],其中,0

開始考慮最小的肯定為a[0]+b[0],如果第k小的是a[m]+b[n],當i<=m,j<=n時,a[i]+b[j]必<=a[m]+b[n],必是在前k個最小的數中,則m*n<=k。(後面不會想了)

參考:如果用最小堆求解思路如下:

首先把a0+b0的結果放入堆中,此時堆中只有乙個元素,自然滿足最小堆條件,然後開始出堆的操作,從堆裡面取出根節點(也就是最小的值),

例如是a[i]+b[j],則需要像最小堆中壓入a[i+1]b[j] 和 a[i]+b[j+1],當然,要保證下標不越界,如果下標越界了則忽略,另外要保證已經壓入過堆中的組合(即使已經從堆中被取出了的)不再被壓入堆中。不段進行出堆、入堆的操作,重複k次,就得到了k個最小的組合值。

堆的最大深度為logk,所以時間複雜度為k*logk數量級。

空間複雜度o(k)

開始感覺這個思路貌似有問題,感覺區域性最小值不一定為全域性最小值,但是看完楊氏矩陣又想了想,還是對的,每次搜尋都是候選最小值,出堆的是全域性最小值。

已知乙個2維矩陣,其中的元素每一行從左至右依次增加,每一列從上到下依次增加。即對於矩陣table有table[i][j] ≤table[i][j + 1], table[i][j] ≤ table[i + 1][j],我們也稱這樣的矩陣為楊氏矩陣。

楊氏矩陣參考

4.給定k個陣列,每個陣列有k個整數。每個陣列中選取乙個整數,一共k個整數,取其和,一共可以得到k^k個和。給出方法,求得這k^k個和中,最小的k個。

這個題目最終歸於第三題,對兩個陣列求和的最小的k個,求出的k個值作為乙個陣列再與第三個陣列求最小的k個,以此類推。

最後的時間複雜度是o(k^2logk)。

兩個有序陣列的第k大數

coding utf 8 兩有序陣列的第k大 一種思路是用o m n 的空間複雜度,然後時間複雜度的話只需要o k 吧,就是從後往前掃k個就ok了 另一就是不需要額外的空復,然後時復o log m n 遞迴 a 19,11,8,7,4,2,0 b 13,8,6,3,1 k 4 m,n len a l...

兩個有序陣列合併

題目描述 已知陣列a中有m個按公升序排列的元素,陣列b中有n個按降序排列的元素,程式設計將a與b中的所有元素按降序存入陣列c中。輸入輸入有兩行,第一行首先是乙個正整數m,然後是m個整數 第二行首先是乙個正整數n,然後是n個整數,m,n均小於等於1000000。輸出輸出合併後的m n個整數,資料之間用...

LeetCode 兩個排序陣列合併問題

merge sorted array 問題 given two sorted integer arrays a and b,merge b into a as one sorted array.常規思想 從b的起始位置開始,將選中的值與a陣列值逐一判斷,找到a i 大於b j 的i將其插入,如此迭代...