給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。例項:請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
nums1 = [1, 3]nums2 = [2]
則中位數是 2.0
nums1 = [1, 2]題解nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
對於時間複雜度o(log(m+n)),自然可以想到用二分查詢法,但是該怎麼查詢呢?看了wait大佬的題解後知道了乙個小 trick,就是找到 (m + n + 1) / 2 ,(m + n + 2) / 2這兩個數值,然後求平均值,這種求法奇偶長度的陣列都管用。
為避免產生新的陣列從而增加時間複雜度,使用兩個變數i 和 j 分別來標記陣列 nums1 和 nums2的起始位置。然後處理邊界,當某乙個陣列的起始位置大於等於其陣列長度時,說明該陣列所有數字均已經被淘汰,相當於空陣列,那麼就該到另乙個陣列中尋找數字。當 k = 1 時,也就是兩個陣列都只有乙個數時,只需要比較起始位置上的數字大小即可。
對於一般情況,用二分法找到第 k 個元素,這也就是為什麼****現 k / 2的原因。要在nums1和nums2中查詢第 k / 2個元素,由於兩個陣列長度不確定,所以要進行判斷是否存在第 k / 2 個元素,存在就取出來,否則就賦值為無窮大。這裡為什麼要賦值為無窮大?
當該陣列中第 k / 2 個元素不存在時,說明這個陣列的長度小於 k / 2,那麼該陣列就不能判斷中位數是否在其中。所以要保留該陣列,而捨棄另乙個陣列的前k/2個數值。這樣就可以進行下一次遞迴。接著,判斷哪邊的取值小,就把哪邊的值移動 k / 2個位置,這一點和二分查詢移動類似。
class
solution
public
intfindkth
(int
nums1,
int i,
int[
] nums2,
int j,
int k)
int midval1 =
(i + k /2-
1< nums1.length)
? nums1[i + k /2-
1]: integer.max_value;
int midval2 =
(j + k /2-
1< nums2.length)
? nums2[j + k /2-
1]: integer.max_value;
if(midval1 < midval2)
else
}}
4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
4 尋找兩個有序陣列的中位數( )
給定兩個大小為 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 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 nums2 3...