有兩個有序數組A和B,設計算法求出A和B的中位數。算法
狀況1. 數組A、B長度相等,設爲n。數組
1)分別計算A和B的中位數m1和m2。spa
2)比較m1和m2。若是m1等於m2,那麼最終結果就是m1(m2)。設計
3)若是m1大於m2,那麼中位數一定在和兩個子數組中。code
4)若是m1小於m2,那麼中位數一定在和兩個子數組中。blog
5)重複上述步驟,直至兩個子數組的大小均爲2,那麼最終結果爲。ip
狀況2. 數組A、B長度不相等,分別設爲m,n(m <= n)。
ci
假設是中位數,那麼由於數組是有序的,必定比數組A中前數大。並且,若是是中位數,必定會比數組B中前個數大。若是且,那麼就是中位數,不然可根據和、關係判斷比中位數大仍是小。由於數組A是有序的,因此能夠利用二分搜索在時間內找到。僞代碼以下:leetcode
imin, imax = 0, m while imin <= imax i = (imin + imax) / 2 j = ((m + n + 1) / 2) - i if j > 0 and i < m and B[j - 1] > A[i] imin = i + 1 else if i > 0 and j < n and A[i - 1] > B[j] imax = i - 1 else if i == 0 num1 = B[j - 1] elif j == 0 num1 = A[i - 1] else num1 = max(A[i - 1], B[j - 1]) if (m + n) & 1: return num1 if i == m num2 = B[j] else if j == n num2 = A[i] else num2 = min(A[i], B[j]) return (num1 + num2) / 2.0
參考資料:http://www.geeksforgeeks.org/median-of-two-sorted-arrays/get
https://oj.leetcode.com/discuss/15790/share-my-o-log-min-m-n-solution-with-explanation
https://oj.leetcode.com/discuss/11174/share-my-iterative-solution-with-o-log-min-n-m
http://www.geeksforgeeks.org/median-of-two-sorted-arrays-of-different-sizes/