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

2021-09-12 08:28:37 字數 1375 閱讀 1243

給定兩個大小為 m 和 n 的有序陣列nums1nums2

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設nums1nums2不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

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