給定兩個大小為 m 和 n 的有序陣列nums1和nums2。
請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。
你可以假設nums1和nums2不同時為空。
示例 1:nums1 = [1, 3] nums2 = [2] 中位數是 2.0
示例 2:nums1 = [1, 2] nums2 = [3, 4] 中位數是 (2 + 3)/2 = 2.5
思路:採用二分法
參考自:
這道題讓我們求兩個有序陣列的中位數,而且限制了時間複雜度為o(log (m+n)),看到這個時間複雜度,自然而然的想到了應該使用二分查詢法來求解。那麼回顧一下中位數的定義,如果某個有序陣列長度是奇數,那麼其中位數就是最中間那個,如果是偶數,那麼就是最中間兩個數字的平均值。這裡對於兩個有序陣列也是一樣的,假設兩個有序陣列的長度分別為m和n,由於兩個陣列長度之和 m+n 的奇偶不確定,因此需要分情況來討論,對於奇數的情況,直接找到最中間的數即可,偶數的話需要求最中間兩個數的平均值。為了簡化**,不分情況討論,我們使用乙個小trick,我們分別找第 (m+n+1) / 2 個,和 (m+n+2) / 2 個,然後求其平均值即可,這對奇偶數均適用。加入 m+n 為奇數的話,那麼其實 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相當於兩個相同的數字相加再除以2,還是其本身。
這裡我們需要定義乙個函式來在兩個有序陣列中找到第k個元素,下面重點來看如何實現找到第k個元素。首先,為了避免產生新的陣列從而增加時間複雜度,我們使用兩個變數i和j分別來標記陣列nums1和nums2的起始位置。然後來處理一些corner cases,比如當某乙個陣列的起始位置大於等於其陣列長度時,說明其所有數字均已經被淘汰了,相當於乙個空陣列了,那麼實際上就變成了在另乙個陣列中找數字,直接就可以找出來了。還有就是如果k=1的話,那麼我們只要比較nums1和nums2的起始位置i和j上的數字就可以了。難點就在於一般的情況怎麼處理?因為我們需要在兩個有序陣列中找到第k個元素,為了加快搜尋的速度,我們要使用二分法,那麼對誰二分呢,陣列麼?其實要對k二分,意思是我們需要分別在nums1和nums2中查詢第k/2個元素,注意這裡由於兩個陣列的長度不定,所以有可能某個陣列沒有第k/2個數字,所以我們需要先check一下,陣列中到底存不存在第k/2個數字,如果存在就取出來,否則就賦值上乙個整型最大值。如果某個陣列沒有第k/2個數字,那麼我們就淘汰另乙個數字的前k/2個數字即可。有沒有可能兩個陣列都不存在第k/2個數字呢,這道題裡是不可能的,因為我們的k不是任意給的,而是給的m+n的中間值,所以必定至少會有乙個陣列是存在第k/2個數字的。最後就是二分法的核心啦,比較這兩個陣列的第k/2小的數字midval1和midval2的大小,如果第乙個陣列的第k/2個數字小的話,那麼說明我們要找的數字肯定不在nums1中的前k/2個數字,所以我們可以將其淘汰,將nums1的起始位置向後移動k/2個,並且此時的k也自減去k/2,呼叫遞迴。反之,我們淘汰nums2中的前k/2個數字,並將nums2的起始位置向後移動k/2個,並且此時的k也自減去k/2,呼叫遞迴即可。
public double findmediansortedarrays(int nums1, int nums2)
public static int findkth(int nums1, int i, int nums2, int j, int k)
int minval1 = ((i + k / 2 - 1) < nums1.length) ? nums1[i + k / 2 - 1] : integer.max_value;
int minval2 = ((j + k / 2 - 1) < nums2.length) ? nums2[j + k / 2 - 1] : integer.max_value;
if(minval1 < minval2)else
}
兩個排序陣列的中位數
求兩個排序陣列中位數,這道題是很有意思的一道題目,演算法導論中9.3 8題,這題必須在o logn 的時間複雜度求解,否則肯定悲劇。這題有個關鍵的條件,那就是這兩個陣列長度相等 思路如下 陣列a 1,3,5,7,9 陣列b 2,4,6,8,10 首先取二者的中位數,在o 1 時間複雜度內求出,那麼陣...
兩個排序陣列的中位數
求兩個排序陣列中位數,這道題是很有意思的一道題目,演算法導論中9.3 8題,這題必須在o logn 的時間複雜度求解,否則肯定悲劇。這題有個關鍵的條件,那就是這兩個陣列長度相等 思路如下 陣列a 1,3,5,7,9 陣列b 2,4,6,8,10 首先取二者的中位數,在o 1 時間複雜度內求出,那麼陣...
兩個排序陣列的中位數
兩個排序的陣列a和b分別含有m和n個數,找到兩個排序陣列的中位數,要求時間複雜度應為o log m n 給出陣列a 1,2,3,4,5,6 b 2,3,4,5 中位數3.5 給出陣列a 1,2,3 b 4,5 中位數 3 public double findmediansortedarrays in...