Number 4 尋找兩個有序陣列的中位數

2021-10-05 04:16:44 字數 1472 閱讀 6154

給定兩個大小為 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...