Problem:4. Median of Two Sorted Arrays
Question
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
思路
- 最简单的思路当然是,直接将给定的两个数组组合起来,然后排序一次(毕竟排序可以做到log(m+n)),这样一来,中位数就等于中间两数的平均数或者是中间数了嘛。
- 另外一种思路,在这两个数组的基础上,划分成两个长度大小的数组,然后找到中位数。
具体可以看以下的例子:
A:
1 3 5 | 7 9
index: 0 1 2 3 4
B:
2 4 | 6 8 10
index: 0 1 2 3 4
中间的 | 代表分割。将数组A和数组B从竖线处分开,两数组左边的部分组成一个新数组,右边组成一个新数组,长度相同。
左 | 右
1 3 5 7 9
2 4 6 8 10
同时满足性质:
A[2] = 5 < B[2] = 6
B[1] = 4 < A[3] = 7
我们把被分割的位置设为 i,j,满足条件:
A[i-1] < B[j]
B[j-1] < A[i]
(i,j != 0, i,j != m, n)
i = 0 时,满足 B[j-1] < A[i]
j = 0 时,满足 A[i-1] < B[j]
i = m 时,满足 A[i-1] < B[j]
j = m 时,满足 B[j-1] < A[i]
代码
简单版:
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
ary = nums1 + nums2;
ary.sort();
size = len(ary)
if len(ary) % 2 == 0:
return (ary[size/2] + ary[(size-1)/2]) / 2.0;
else:
return ary[size/2];
复杂一点:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
std::vector<int> A = (nums1.size() > nums2.size() ? nums2 : nums1);
std::vector<int> B = (nums1.size() > nums2.size() ? nums1 : nums2);
int m = A.size();
int n = B.size();
int imin = 0, imax = m, i, j;
while (imin<=imax) {
i = (imin + imax) / 2;
j = (m+n+1)/2 - i;
if (i < imax && B[j-1] > A[i]) {
imin = imin+1;
}
else if (i > imin && A[i-1] > B[j]) {
imax = imax-1;
}
else {
int maxleft = 0;
if (i == 0) maxleft = B[j-1];
else if (j == 0) maxleft = A[i-1];
else maxleft = max(A[i-1], B[j-1]);
int minright = 0;
if (i == m) minright = B[j];
else if (j == n) minright = A[i];
else minright = min(A[i], B[j]);
if ((m+n)%2 == 1) return maxleft;
else return (maxleft + minright) / 2.0;
}
}
return 0.0;
}
};