您的位置:首页 > 其它

两个有序数组,判断一个给定的数p在合并后的位置

2015-09-07 17:32 495 查看
有两个有序数组,给定的一个数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;

}


若有改进之处,望高手指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: