数组定和元素求解探究

8 篇文章 0 订阅
5 篇文章 0 订阅

数组定和元素求解几种简单实现

<span style="font-size:18px;">#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
#include<cassert>
#include<string>
using namespace std;
//在数组中寻找两个元素 其和与sum相等
bool FindTwoElementOfSum(const int* p, int len, int sum)
{
	assert(nullptr!=p);
	assert(len > 0);
	bool bFlag = false;
	for (int i = 0; i < len; ++i)
	{
		if (binary_search(p + i+1, p + len, sum - p[i]))
		{
			bFlag = false;
			cout << p[i] << "+" << sum - p[i] << "=" << sum << endl;
		}
	}
	return bFlag;
}

//用两个指针在O(n)复杂度 找出两个元素
bool FindTwoElementOfSum1(const int* p, int len, int sum)
{
	const int* pBeg = p;
	const int* pEnd = pBeg + len-1;
	bool bFlag = false;
	while(pBeg<pEnd)
	{
		if (*pBeg + *pEnd>sum)
		{
			--pEnd;
		}
		else if (*pBeg + *pEnd < sum)
		{
			++pBeg;
		}
		else
		{
			bFlag = true;
			cout << *pBeg << "+" << *pEnd << "=" << sum << endl;
			++pBeg;
		}
	}
	return bFlag;
}


//-----------------------------------------------

void FindAllElemOfSum(const int* p, int len, int sum)
{
	assert(nullptr != p);
	static vector<int> vec;
	if (len < 0||sum<0)//由于递归是很耗时的尽早退出 也可以加速
	{
		return;
	}
	if (0 == sum)
	{
		copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
		puts("");
		return;
	}
	vec.push_back(*p);
	FindAllElemOfSum(p+1,len-1,sum-*p);
	vec.pop_back();
	FindAllElemOfSum(p + 1, len - 1, sum);
}

void FindkElemOfSum(const int* p, int len, int sum,int k)
{
	assert(nullptr != p);
	static vector<int> vec;
	if (len < 0||sum<0)
	{
		return;
	}
	if (0 == sum&&0==k)
	{
		copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
		puts("");
		return;
	}
	vec.push_back(*p);
	FindkElemOfSum(p + 1, len - 1, sum - *p,k-1);
	vec.pop_back();
	FindkElemOfSum(p + 1, len - 1, sum,k);
}


//---------------------------------------------

int ChangeMoney(int val,int k)
{	
	static int date[] = { 1,2,5,10 };
	static vector<int> vec;
	if (0 == val)
	{
		copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
		puts("");
		return 1;
	}
	if (0==k||val<0)//递归出口不要写错
	{
		return 0;
	}
	vec.push_back(date[k-1]);
	int k1=ChangeMoney(val-date[k-1],k);
	vec.pop_back();
	int k2=ChangeMoney(val,k-1);
	return k1 + k2;
}

int main(void)
{
	int array[] = {1,2,3,4,5,6,7,9,10};
	int len = sizeof(array) / sizeof(array[0]);
	//FindTwoElementOfSum(array,len,10);
	//FindTwoElementOfSum1(array,len,10);
	FindAllElemOfSum(array, len, 10);
	puts("---------------------");
	FindkElemOfSum(array, len, 10,2);
	puts("---------------------");
	cout << "count:" << ChangeMoney(10,4);
	return 0;
}</span>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值