- n1,数组1元素总个数,n2,数组2元素总个数
- 一个大前提假设:
- k=(n1+n2+1)/2 当(n1+n2)为奇数时,第k个就是中位数,当(n1+n2)为偶数时,第k和第k+1个数是两个正中间的数
- m1:从数组1中取的元素的个数,m2:从数组2中取的元素的个数
- 最终目的:l=r=m1=k-m2。 此时此刻 nums1[m1-1],nums1[m1],nums2[m2-1],nums2[m2] 四个数刚好杂糅在一起
// // [0…m1-1],[0…m2-1]共同构成序列的前一半,[m1…n1], [m2…n2]则共同构成后一半 - 如果相等,说明[A_m1-1 A_m1 B_m2-1 Bm2 中,两个A只存在一个]
- 最后求c1,c2。分别考虑了不存在这四个数的情况。
- m1==0 说明中位数不在数组1中,
- m1==n1说明数组1只存在nums1[m1-1]那个元素,没有第nums1[m1]元素,所以需要拿nums1[m1]跟nums2[m2]出来比谁大时,直接pass掉第一个就可以了
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n1=nums1.size(), n2=nums2.size();
if(n1>n2) return findMedianSortedArrays(nums2, nums1);
int k=(n1+n2+1)/2;
int l=0, r=n1;
int m1,m2;
while(l<r){
m1=l+(r-l)/2;
m2=k-m1;
if(nums1[m1]<nums2[m2-1]){
l=m1+1;
}else r=m1;
}
m1=r;
m2=k-m1;
int c1=max(m1==0?INT_MIN:nums1[m1-1], m2==0?INT_MIN:nums2[m2-1]);
if((n1+n2)&1) return c1;
int c2=min(m1==n1?INT_MAX:nums1[m1], m2==n2?INT_MAX:nums2[m2]);
return 0.5*(c1+c2);
}
};