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

2021-09-27 01:46:11 字數 1674 閱讀 5598

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

示例1:1,2,3,4,5,6; 中位數為:3.5

示例2:1 236 7 ; 中位數為:3

官方答案中的解釋很長,具體總結就是將兩個陣列合併然後分成兩部分,但要尋找臨界條件,也就中位數成立調解。

1.len(left_part)=len(right_part)

2.max(left_part)≤min(right_part)

class solution 

int imin = 0, imax = m, halflen = (m + n + 1)/2;// 偶數時,左側值,奇數時,中間值; m為大數

while(imin <= imax)

else if(i > imin && nums1[i-1] > nums2[j])

else

else if(j == 0)

else

if((m + n) % 2 == 1)

return maxleft;

int minright = 0;

if(i == m)

minright = nums2[j];

else if(j == n)

minright = nums1[i];

else

minright = (nums1[i] < nums2[j]?nums1[i]:nums2[j]);

return (maxleft + minright)/2.0;}}

return 0.0;}};

複雜度分析

時間複雜度:o(log(min(m,n)))。首先,查詢的區間是 [0, m]。 而該區間的長度在每次迴圈之後都會減少為原來的一半。 所以,我們只需要執行 log(m) 次迴圈。由於我們在每次迴圈中進行常量次數的操作,所以時間複雜度為 o(log(m))。 由於 m≤n,所以時間複雜度是 o(log(min(m,n)))。

空間複雜度:o(1), 只需要恆定的記憶體來儲存 有限 個區域性變數, 所以空間複雜度為o(1)。

// 此方案,超記憶體

class solution

// 排序

sort(merge.begin(), merge.end());

// 取中點

if(merge.size() > 0 && merge.size() % 2 == 1)

else if(merge.size() > 0 && merge.size() % 2 == 0)

else

return 0.0;}};

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

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode 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,...

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

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...