思路是直接取出合并后的数组长度设为n+m
设i为nums1的指针,初始值是-1
设j为nums2的指针,初始值是-1
当i+j+2=(n+m)/2+1或i+j+2 = (n+m)/2+1时时就计算中间值。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
//cout<< "n1=" <<n<<" m1="<<m<<endl;
//长度都为零时
if(n==0&&m==0)return 0;
//下面两个判断都是有一个数组长度为零直接计算
if(n==0){
if(m%2!=0)
return nums2[m/2];
if(m%2==0)
return (double(nums2[m/2])+nums2[m/2-1])/2;
}
if(m==0){
//cout<< "n2=" <<n%2<<" m2="<<m<<endl;
if(n%2!=0)
return nums1[n/2];
if(n%2==0)
return (double(nums1[n/2])+nums1[n/2-1])/2;
}
//cout<< "n=" <<n<<" m="<<m<<endl;
int i = -1,j = -1;
int temp = 0;
while(i!=n-1||j!=m-1){
//cout<<'o'<<endl;
//j==m-1是为了防止j溢出
//i!=n-1是为了不让i溢出
if(j==m-1||i!=n-1&&nums1[i+1]<=nums2[j+1]){
//cout<< "nums1=" <<nums1[i+1]<<" nums2="<<nums2[j+1]<<endl;
i++;
//长度为奇数
if((n+m)%2!=0){
//(n+m)/2+1是中间数的位置,
//如3/2=1,1+1 = 2,所以第二个数字是中间数
//i+j+2代表进了几位
if((n+m)/2+1==i+j+2){
return nums1[i];
}
}
//长度为偶数
else if((n+m)%2==0){
if((n+m)/2+1==i+j+2){
double d = (nums1[i]+temp)/2;
return (double(nums1[i])+temp)/2;;
}
}
//记住这个数,留下从循环使用
temp = nums1[i];
}else{
j++;//表示进一位
//cout<< "i1=" <<i<<" j1="<<j<<endl;
//长度为奇数
if((n+m)%2!=0){
if((n+m)/2+1==i+j+2){
return nums2[j];
}
}
//长度为偶数
else if((n+m)%2==0){
if((n+m)/2+1==i+j+2){
double d = (double(nums2[j])+temp)/2;
//cout<<nums2[j]<<" "<<temp<<endl;
return (double(nums2[j])+temp)/2;;
}
}
//记住这个数,留下从循环使用
temp = nums2[j];
}
//cout<< "i=" <<i<<" j="<<j<<endl;
}
//cout<<"跳过所有"<<endl;
return 0;
}
};