题链:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
题意:求两个升序数组合并之后的中位数
思路:问题可以转化为求两个升序数组合并之后第k小的数。
假设有a[0...k/2-1...n],b[0...k/2-1...m]
1.如果a[k/2-1]<b[k/2-1],那么我们可以“删除” a[0...k/2-1],从剩下的数中找第k-k/2小的数。
2.如果a[k/2-1]>b[k/2-1],那么我们可以“删除” b[0...k/2-1],从剩下的数中找第k-k/2小的数。
3.如果a[k/2-1]==b[k/2-1],我们可以视为第一种情况。
这样k每次减小一半,类似二分查找。
注意一些边界情况即可。
class Solution {
public:
double findMedianSortedArrays(vector<int>& a, vector<int>& b) {
int n2,nn,n = a.size(),m = b.size();
nn=n+m;
n2=(nn>>1);
if(nn&1) return 1.0*getk(n2+1,a,n,b,m);
else return (getk(n2,a,n,b,m)+getk(n2+1,a,n,b,m))/2.0;
}
int getk(int k,vector<int>& a,int n,vector<int>& b,int m){
int i=0,j=0,ni,nj;
while(1){
if(i==n) return b[j+k-1];
if(j==m) return a[i+k-1];
if(k==1) return min(a[i],b[j]);
ni=min(i+k/2,n);
nj=min(j+k/2,m);
if(a[ni-1]<=b[nj-1]){
k-=(ni-i);
i=ni;
}else{
k-=(nj-j);
j=nj;
}
}
}
};