[leetcode] 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)).
You may assume nums1 and nums2 cannot be both empty.
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
Solution:
nums1和nums2是两个已经排好序的数组,为了找出他们的中位数,复杂度是
O(log(min(nums1.length,nums2.length)))
O
(
log
(
m
i
n
(
n
u
m
s
1.
l
e
n
g
t
h
,
n
u
m
s
2.
l
e
n
g
t
h
)
)
)
中位数:对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
因此,对于nums1和nums2合并后的数组应该有:
len(left)=len(right) l e n ( l e f t ) = l e n ( r i g h t )
但是在这里不能合并两个数组,因为这样需要花费的时间太长。所以在这个题目中,我采用二分逼近的方法,二分的速度取决于数组的长度,为了防止极端的情况:例如nums1的长度为10,nums2的长度为1000000,应当选择较短的数组进行二分。
根据中位数的定义,我们应当始终保证 i+j=halfLen i + j = h a l f L e n 这样在求解过程中,就可以保证结果的正确性。
然后根据对应位置的数值来移动数组的上界和下界。
最终代码如下所示:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int>& numsTemp1 = nums1.size() < nums2.size() ? nums1 : nums2;
vector<int>& numsTemp2 = nums1.size() < nums2.size() ? nums2 : nums1;
int pMin = 0, pMax = numsTemp1.size(), i, j, halfLen = (numsTemp1.size() + numsTemp2.size() + 1) / 2;
while(pMin <= pMax) {
i = (pMin + pMax) / 2;
j = halfLen - i;
if(i < pMax && numsTemp2[j-1] > numsTemp1[i])
pMin = i + 1;
else if (i > pMin && numsTemp1[i-1] > numsTemp2[j])
pMax = i - 1;
else {
int leftMax, rightMin;
if(i == 0)
leftMax = numsTemp2[j-1];
else if(j == 0)
leftMax = numsTemp1[i-1];
else
leftMax = numsTemp1[i-1] > numsTemp2[j-1] ? numsTemp1[i-1] : numsTemp2[j-1];
if((nums1.size() + nums2.size()) % 2)
return leftMax;
if(i == numsTemp1.size())
rightMin = numsTemp2[j];
else if(j == numsTemp2.size())
rightMin = numsTemp1[i];
else
rightMin = numsTemp1[i] < numsTemp2[j] ? numsTemp1[i] : numsTemp2[j];
return (leftMax + rightMin) / 2.0;
}
}
return 0;
}
};