数组定和元素求解几种简单实现
<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>