給定兩個大小為 m 和 n 的有序陣列nums1
和nums2
。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設nums1
和nums2
不會同時為空。
示例 1:
nums1 = [1, 3]示例 2:nums2 = [2]
則中位數是 2.0
nums1 = [1, 2]解題思路nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
本題若沒有限制時間複雜度為o(log(m+n))的話,對兩個陣列使用歸併排序,很容易可以找到他們的中位數,所用時間複雜度為o(m*n)。但是要將時間複雜度降為o(log(m+n)),就需要嘗試對兩個陣列同時進行二分查詢,逐步排除掉不可能出現中位數的區間,最後找到所求的中位數。這種解法的主要思想就是:
如果陣列a的中位數小於陣列b的中位數,那麼整體的中位數只可能出現在a的右區間加上b的左區間之中;
如果陣列a的中位數大於等於陣列b的中位數,那麼整體的中位數只可能出現在a的左區間加上b的右區間之中。
關鍵就是利用分治的思想逐漸縮小a的區間和b的區間來找到中位數。
//歸併排序
class solution
if (nums2.empty())
int i = 0;
int j = 0;
vectorans;
while (i < m && j < n) else
}if (i < m) else if (j < n)
int len = ans.size();
if (len%2 != 0)
return 1.0*ans[len/2];
return (ans[len/2]+ans[len/2-1])/2.0;
}};
//二分查詢
class solution
if (nums2.empty())
int total = (m+n+1)/2;
int total2 = (m+n+2)/2;
return (find_kth(nums1,0,nums2,0,total)+find_kth(nums1,0,nums2,0,total2))/2.0;
}double find_kth(vectora, int a_begin, vectorb, int b_begin, int k)
};
原文:
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,...
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...