两个排好序的数组找第k大

这个问题暂时做了两个思路,第一种从头到尾不断相加,因为两个数组都是排好序的,那就从头往后,直到相加的结果为第k 个,代码为

int findKthSmall(vector<int> &a, vector<int> &b, int k)
{
	int aindex = 0, bindex = 0;
	int alen = a.size(), blen = b.size();
	//cout<<alen<<'\t'<<blen<<endl;
	if (alen + blen < k) return INT_MIN;
	while (aindex<alen && bindex<blen)
	{
		if (a[aindex] < b[bindex])
		{
			aindex++;
			//每次进行判断,若遍历到a时达到k,则返回a[aindex-1]
			if (aindex + bindex == k) return a[aindex - 1];
		}
		else
		{
			bindex++;
			//每次进行判断,若遍历到b时达到k,则返回b[bindex-1]
			if (aindex + bindex == k) return b[bindex - 1];
		}
	}
	while (aindex < alen)
	{
		aindex++;
		if (aindex + bindex == k) return a[aindex - 1];
	}
	while (bindex < blen)
	{
		bindex++;
		if (aindex + bindex == k) return b[bindex - 1];
	}
}
第二种做法,是一种二分的想法,既然要找第k个,可以先找两个数组2/k个位置,哪个小哪个就去掉了嘛,当然判断有三种情况的,重复直到k为1,当然最后输出结果的时候再判断一下。

int findKthSmall(vector<int> &a, vector<int> &b, int k)
{
	int temp = 0;
	while (k != 1)
	{
		temp = k / 2-1;
		if (a[temp] < b[temp])
		{
			for (int i = 0; i <=temp; i++)
			{
				a.erase(a.begin());
			}
		}
		else if(a[temp] > b[temp])
		{
			for (int i = 0; i <=temp; i++)
			{
				b.erase(b.begin());
			}
		}
		else
		{
			return a[temp];
			break;
		}
		k = k - temp-1;
	}
	if (a.size() > 0 && b.size() > 0)
	{
		return MIN(a[0], b[0]);
	}
	else if (a.size() > 0)
	{
		return a[0];
	}
	else
	{
		return b[0];
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值