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