4. Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
這題大致有兩種解法,第一種使用中位數的定義(將有序數組分爲同等兩部分)然後通過二分法尋找滿足中位數的切割。
第二種解法比較通俗易懂,利用另外一個問題:在兩個有序數組中找k-th小的數。
Let’s say we have two arrays:
The array after merging two arrays:
goal: find
Theorem: say if
Assume that
In the merged array, there are
In the first array, there are
In the second array, there are at most
Thus there are at most
How to use this theorem?
Compare
if
else return
So the median of two sorted arrays could be solved in
class Solution
{
private:
int k_th(vector<int>::iterator a, int m, vector<int>::iterator b, int n, int k)
{
if (m < n) return k_th(b, n, a, m, k);
if (n == 0) return *(a + k - 1);
if (k == 1) return min(*a, *b);
int j = min(k / 2, n);
int i = k - j;
if (*(a + (i - 1)) > *(b + (j - 1)))
return k_th(a, i, b + j, n - j, k - j);
return k_th(a + i, m - i, b, j, k - i);
}
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int m = nums1.size(), n = nums2.size();
int m1 = k_th(nums1.begin(), m, nums2.begin(), n, (m + n) / 2 + 1);
if ((m + n) % 2 == 0)
return (m1 + k_th(nums1.begin(), m, nums2.begin(), n, (m + n) / 2)) / 2.0;
return m1;
}
};