有两个有序数组,给定的一个数p(p是两个数组中的任意一个数,也可能同时存在于两个数组之中),判断这个数p在两个数组合并后的大数组的位置。
要求:空间复杂度为O(1),即不能真正合并两个数组
以下代码实现,其时间复杂度为O(log(m)+log(n)):
#include <iostream>
#include<vector>
using namespace std;
int getkth(vector<int> arrays,int left,int p){
int i =0;
for( i =left;i<arrays.size();i++){
if(arrays[i]>=p)
{
i--;
break;
}
}
return i;
}
int find(vector<int> a,int aleft,int aright,vector<int> b,int bleft,int bright ,int p){
int amid= (aleft+aright)/2;
int bmid= (bleft+bright)/2;
if(aleft>=aright){
return aleft+getkth(b,bleft,p)+2;
}
if(bleft>=bright){
return bleft+getkth(a,aleft,p)+2;
}
if(a[amid]<=b[bmid]){
if(p>b[bmid])
return find(a,amid+1,aright,b,bmid+1,bright,p);
if(p<=b[bmid]&&p>a[amid])
return find(a,amid+1,aright,b,bleft,bmid,p);
if(p<=a[amid])
return find(a,aleft,amid,b,bleft,bmid,p);
}else{
if(p>a[amid])
return find(a,amid+1,aright,b,bmid+1,bright,p);
if(p<=a[amid]&&p>b[bmid])
return find(a,aleft,amid,b,bmid+1,bright,p);
if(p<=b[bmid])
return find(a,aleft,amid,b,bleft,bmid,p);
}
}
int main () {
int num = 7;
int p=5;
int a[]={1,2,5,5,5,5,6};
int b[]={2,3,5,7,9,10,11};
vector<int> ai;
vector<int> bi;
for(int i=0;i<num;i++){
ai.push_back(a[i]);
bi.push_back(b[i]);
}
int pos = find(ai,0,ai.size()-1,bi,0,bi.size()-1,p);
cout<<pos<<endl;
}
若有改进之处,望高手指正。