1.题目
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空
2.代码
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len=nums1.size()+nums2.size();
int arr[len];
int i,j;
for(i=0;i<nums1.size();i++){
arr[i]=nums1[i];
}
for(j=0;j<nums2.size();j++){
arr[i++]=nums2[j];
}
sort(arr,arr+len);
if(len%2==0)
return (double)(arr[len/2-1]+arr[len/2])/2;
else
return arr[len/2];
}
};
3.优秀案例
class Solution {
public:
double findMedianSortedArrays(vector<int>& A, vector<int>& B) {
int m=A.size(), n=B.size();
if(m>n) {swap(A, B); swap(m, n);}
int i, j, left=0, right=m; // for total odd elements, left side has i more
int tt=m+n+1;
while(left<=right) {
i=(left+right) >> 1;
j = (tt >> 1) - i;
if(i<m && B[j-1]>A[i]) left = i+1; // i is too small
else if(i>0 && A[i-1]>B[j]) right = i-1; // i is too big
else {
int leftMax, rightMin;
if(i == 0) leftMax = B[j-1];
else if(j == 0) leftMax = A[i-1];
else leftMax = max(A[i-1], B[j-1]);
if((m+n)%2) return leftMax;
if(i == m) rightMin = B[j];
else if(j == n) rightMin = A[i];
else rightMin = min(A[i], B[j]);
return (leftMax + rightMin)/2.0;
}
}
}
};