求一堆数中三个数的和为特定值的解

来源:互联网 发布:多系统数据一直性 编辑:程序博客网 时间:2024/06/03 15:40

我觉得比较好的方法:

对原始数据排序。将第一个数依次选举。然后在其后面求两个数的和为特定值的问题。复杂度为O(n^2)

参考代码:

#include<iostream>#include<vector>using namespace std;int Num[]={1,2,3,4,5,6,7,8,9,10};int Len=10;void find1(int *num,int result,int len){int i,j,k;for(i=0;i<len-2;i++){for(j=i+1;j<len-1;j++){for(k=j+1;k<len;k++){if ( num[i]+num[j]+num[k] == result){cout<<num[i]<<"+"<<num[j]<<"+"<<num[k]<<"="<<result<<endl;}}}}}int total=0;void find2(int *num, int start, int result,int len, int count){if(count==1){int i;for(i=start;i<len;i++){if(num[i]==result){total++;}}}else{if(start<len-count+1)            //判断第i个数是否在结果中。{find2(num,start+1,result-num[start],len,count-1);find2(num,start+1,result,len,count);}}}int total3=0;void find3(int *num,int start,int result,int len,int count){int i;if(count==1){for(i=start;i<len;i++){if(num[i]==result)total3++;}}else{if(start<len)for(i=start;i<len;i++){find3(num,i+1,result-num[i],len,count-1); //指从第i个数开始。}}}vector<int> temp;vector< vector<int> > result;int total4=0;void find4(int *num,int R,int len,int count){int i;for(i=0;i<len;i++)  //每个数依次可以访问{int size =result.size();int j;for(j=0;j<size;j++){vector< vector<int> >::iterator p=result.begin();temp=p[j];temp.push_back(num[i]);result.push_back(temp);}vector<int> T;T.push_back(num[i]);result.push_back(T);}vector< vector<int> >::iterator p=result.begin();for(p;p!=result.end();p++){if(p->size()==count){temp=*p;int sum=0;vector<int>::iterator q=temp.begin();for(q;q!=temp.end();q++)sum+=*q;if(sum==R)total4++;}}}int total5=0;void func(int *num,int start,int len,int result)      //要求已排序,且没有相同的数字{int *p=num+start;int *q=num+len-1;while(p<q){if(*p + *q <result)p++;else if(*p + *q >result)q--;else{total5++;p++;q--;}}}void find5(int *num,int len, int result){int i;for(i=0;i<len-2;i++){func(num,i+1,len,result-num[i]);}}int main(){find1(Num,14,10);cout<<"##################"<<endl;find2(Num,0,14,10,3);cout<<total<<endl;find3(Num,0,14,10,3);cout<<total3<<endl;find4(Num,14,10,3);cout<<total4<<endl;find5(Num,10,14);return 0;}



原创粉丝点击