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

有两个有序数组,给定的一个数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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值