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;
}
}
}
};