好好地寫寫這個題目的解法吧。
因爲複雜度是logn的,因此考慮要用到二分。
首先,假設兩個數組的長度都是奇數,並且大於1。令mid 爲 (1 + n) / 2,也就是中間的那個元素的下標。考慮一下X[mid]和Y[mid]的大小關係:
(1) X[mid] > Y[mid]
這種狀況下,咱們能夠想,當咱們把兩個數組合並排序後,X[mid]的排名(排名從1開始)確定是大於n的,由於咱們能夠肯定這些元素必定小於等於X[mid]:X[1...mid - 1],Y[1...mid - 1] ,Y[mid]。
同理,能夠分析出來,Y[mid]的排名確定是小於n + 1的。引入一個定理,若是咱們同時殺掉X[mid]後面的任意k個元素和Y[mid]前面的任意k個元素(k > 0),那麼,獲得的新的兩個數組的中位數,與原數組,仍然是同樣的。這個定理畫個圖不難證實。因此,原問題就被轉化爲一個更小的子問題了。
(2)X[mid] == Y[mid]
卻是這種狀況,我想了好久,到底應該怎麼處理。後來發現,本身犯傻了。若是X[mid]等於Y[mid]的話,考慮一下咱們排序的過程。首先,咱們能夠將X[1...mid-1]和Y[1...mid-1]合併排序獲得一個長度爲2*(mid-1)的新數組P,而後咱們把X[mid + 1...n]和Y[mid + 1...n]合併排序,獲得一個長度也是2*(mid-1)的新數組R,最後,咱們把X[mid] 和 Y[mid]插在中間,就獲得最後的有序數組了:P,X[mid],Y[mid],R
也就是說,當X[mid] == Y[mid]時,你能夠立刻肯定X[mid]和Y[mid]就是你要找的兩個中位數!
(3)X[mid] < Y[mid]
這種狀況和狀況(1)對稱,不累贅了。
而後,假設兩個數組的長度都是偶數,並且大於1。令mid爲(1+n)/ 2,也就是中間的兩個元素裏左邊的那個元素的下標。考慮一下X[mid] 和 Y[mid + 1]的大小關係
(1)X[mid] > Y[mid]
使用與上面奇數長度的狀況的相似的思路,咱們能夠知道,X[mid]的排名在一半之後,而Y[mid]的排名在一半之後,因此,咱們也能夠用一樣的思路來縮小問題的規模。
(2) X[mid] == Y[mid]
一樣的思路,因此一樣的結論。當它們相等的時候,你是能夠立刻肯定它們就是你要找的兩個中位數。
(3)X[mid] < Y[mid]
對稱,同樣的作法。
數組