1. 程式人生 > >求兩個不等長、有序陣列a和b的中位數的最優解(排除法 )

求兩個不等長、有序陣列a和b的中位數的最優解(排除法 )

求兩個排序陣列A和B的中位數

最優解 O(log (m+n))

不斷刪除個 k/2個數,然後 k = k/2

不斷刪掉陣列中肯定不是第k小的那些數字,從而能夠不斷地減小陣列,在這個過程中,我們要找的那個數字的序號(k)也會不斷地減小。

陣列中的哪些數字可以刪除呢?

讓我們假設k是4:

nums1: [a1, a2, a3, ...]

nums2: [b1, b2, b3, ...]

如果a2<b2,那麼a2肯定可以刪除。因為有可能比a2小的數字只有:

  1. a1。它肯定比a2小,因為陣列已排序。
  2. b1。它有可能比a2小。

因此,a2最多隻能是第3小的數字,肯定比我們要找的第4數字要小!從而a2,以及比a2還小的a1,都可以刪除。

刪除這兩個數字以後,問題變成了:

nums1: [a3, ...]

nums2: [b1, b2, b3, ...]

從以上兩個已排序陣列中找出第2小的數字。(k已經變了,因為我們已經刪除了兩個比我們要找的那個數字還小的數字。)

同理,我們可以刪除a3和b1中較小的那個數字,然後問題變成從剩餘數字中找到第1小的數字。這個問題不就簡單了嗎?

原文來自微信。