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

来源:互联网 发布:p2p java 借款 源代码 编辑:程序博客网 时间:2024/04/28 15:24

有两个有序数组,给定的一个数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;}

若有改进之处,望高手指正。

0 0
原创粉丝点击