找出序列中满足条件的所有组合
有一数组,元素无序排列,给定一个数,如何从该数组找到两个数的和等于这个数的组合。 比如说 数组 a [1,2,3,4,5],现在要找的和等于6的所有组合,(1,5)(2,4)。 请问是该用二叉树吗? 谢谢。
[解决办法]
来个笨方法,抛砖引玉:
vector<int> vec;int curSum = 0;void fun(int k[], int begin, int end, int sum){ if(begin>end) return; vec.push_back(k[begin]); curSum += k[begin]; if(curSum == sum){ for(unsigned int i=0; i<vec.size(); ++i) cout<<vec[i]<<" "; cout<<endl; } fun(k,begin+1,end,sum); vec.pop_back(); curSum -= k[begin]; fun(k,begin+1,end,sum);}int main(){ int k[] = {1,2,3,4,5}; fun(k,0,5,6); return 0;}
[解决办法]
用C写一个
#include "stdlib.h"
#include "stdio.h"
int find(char array[10],int temp,int flag);
int main(){
char array[10]={1,2,3,4,5,6,7,8,9,10};
int i=0,len=10,sum=0,flag=0,temp=0;;
printf("请输入一个数:\n");
scanf("%d",&sum);
while(i<len){
temp=sum-array[i];
flag=find(array,temp,flag);
if(flag==1){
printf("%d+%d=%d\n",array[i],temp,sum);
}
flag=0;
i++;
}
return 0;
}
int find(char array[10],int temp,int flag){
int i=0;
while(array[i]){
if(array[i]==temp)
flag=1;
i++;
}
return flag;
}
[解决办法]
比如A B C D E,其中2*C = F,则以C为分割点,两边对称取组合,满足要求了
[解决办法]
1.从小到大排序成大小为n的数组Array
2.定义下标i=0, j=n-1
3.若Num=Array[i]+Array[j],则输出,且i++,j--;
若Num>Array[i]+Array[j],则i++;
若Num<Array[i]+Array[j],则j--
4.若i<j,则转至第3步;否则结束