寻找和为定值的两个数:
//寻找和为定值的两个数
#include <iostream>
using namespace std;
#include <list>
排序夹逼 时间复杂度为O(nlogn+n) = O(nlogn),空间复杂度:O(1)
void TwoSum(int a[], unsigned int length, int sum)
{
//sort(s, s+n);数组不是有序的,就先排成有序的,时间复杂度为O(nlogn)
int start = 0;
int end = length-1;
//两头扫描法,时间复杂度为O(n)
while(start < end)
{
long currSum = a[start] + a[end];
if(currSum == sum)
{
//题目要求输出满足条件的一对即可
printf("%d %d\n", a[start], a[end]);
//如果需要所有满足条件的数对,则需要加上下面两条语句
//start++;
//end--;
break;
}
else
{
if(currSum < sum)
start++;
else
end--;
}
}
}
void FunTest()
{
int array[] = {1, 2, 4, 5, 10, 7, 11, 15};
TwoSum(array, sizeof(array)/sizeof(array[0]), 15);
}
int main()
{
FunTest();
system("pause");
return 0;
}
寻找和为定值的多个数:
解法一:n问题转换为n-1问题
//寻找和为定值的多个数
//解法一:n问题转换为n-1问题
list<int> list1;
void SumOfkNumber(int sum, int n)
{
//递归出口
if(n <= 0 || sum <= 0)
return;
//输出找到的结果
if(sum == n)
{
// 反转list
list1.reverse();
for(list<int>::iterator it= list1.begin(); it != list1.end(); ++it)
cout<< *it <<"+";
cout<< n <<endl;
//再次反转list
list1.reverse();
}
list1.push_front(n);
SumOfkNumber(sum-n, n-1); //放n,前n-1个数填满sum-n
list1.pop_front();
SumOfkNumber(sum, n-1); //不放n,前n-1个数填满sum
}
void FunTest()
{
SumOfkNumber(16, 10);
}
int main()
{
FunTest();
system("pause");
return 0;
}
运行结果:
解法二:回溯剪枝:
//解法二:回溯剪枝
//输入t和r, 尝试Wk
void SumOfkNumber(int t, int k, int r, int& M, bool& flag, bool* X)
{
X[k] = true; //选第k个数
if( t+k == M) //若找到一个和为M, 则设置解向量的标志位, 输出解
{
flag = true;
for(int i=1; i<=k; ++i)
{
if(X[i] == 1)
cout<<i<<"+";
}
cout<<endl;
}
else
{
//若选第k+1个数满足条件,则递归左子树
if( t+k+(k+1) <= M)
SumOfkNumber(t+k, k+1, r-k, M,flag, X);
//若不选第k个数,选第k+1个数满足条件,则递归右子树
if((t+r-k >= M) && (t+(k+1) <= M))
{
X[k] = false;
SumOfkNumber(t, k+1, r-k, M, flag, X);
}
}
}
void Search(int& N, int& M)
{
//初始化解空间
bool* X = (bool*)malloc(sizeof(bool)*(N+1));
memset(X, false, sizeof(bool)*(N+1));
int sum = (N+1)*N/2;
if(1>M || sum<M) //预先排除无解情况
{
cout<<"Not found\n";
return;
}
bool f = false;
SumOfkNumber(0, 1, sum, M, f, X);
if(!f)
cout<<"Not found\n";
free(X);
}
void FunTest()
{
int N = 10;
int M = 16;
Search(N, M);
}
int main()
{
FunTest();
system("pause");
return 0;
}
运行结果: