-
题目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, 4]
则中位数是 (2 + 3)/2 = 2.5
这个中位数还不是很理解,照着答案理解了一遍。总觉得很奇怪
// C++完成
class Solution {
public:
double findMedianSortedArrays(vector<int>& A, vector<int>& B) {
int m = A.size();
int n = B.size();
if(m>n)//保证A的规模小于B
{
vector<int> temp =A; A=B; B=temp;
int tmp =m; m=n; n=tmp;
}
int iMin=0; int iMax=m; int halfLen=(m+n+1)/2;
while(iMin<=iMax)
{
int i = (iMin+iMax)/2;
int j = halfLen - i;
if(i<iMax && B[j-1]> A[i])
{
iMin=i+1;//i太小
}
else if(i>iMin && A[i-1]>B[j])
{
iMax = i-1;//i太大
}
else
{
int maxLeft =0;
if(i==0)
{
maxLeft = B[j-1];
}
else if(j==0)
{
maxLeft=A[i-1];
}
else
{
maxLeft= A[i-1]>=B[j-1]?A[i-1]:B[j-1];
}
if((m+n)%2==1) return maxLeft;
int minRight=0;
if(i==m)
{
minRight=B[j];
}
else if(j==n) minRight=A[i];
else
minRight = A[i]>=B[j]?B[j]:A[i];
return (maxLeft +minRight)/2.0;
}
}
return 0.0;
}
};