求一堆数中三个数的和为特定值的解
来源:互联网 发布:多系统数据一直性 编辑:程序博客网 时间: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;}
- 求一堆数中三个数的和为特定值的解
- 求三个数中最大的数
- 求一组数中的的和为给定值的三个数(3sum)
- 求一个数组中三个数和为0的组合
- 求三个数中最大数和最小数的差值
- 用宏定义求三个数中最小的数
- 求三个数中最大数的几种方法
- 查找和为0的三个数
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 求三个数的中间值
- 求三个数的平均数
- 求三个数的最大值
- 求三个数的最小公倍数
- 求三个数的最大值
- 求三个数的最小公倍数
- 求三个数的最小公倍数
- 第七周 求三个数中最大和最小数的程序
- 求三个数的中间数
- trim()函数:仅仅改变指针指向,没有删除及移动字符,提高了效率
- 学习POI处理word
- void声明空参数表,main()函数的参数也可以用void填充表示没有参数
- OpenCV 2.3.x/2.4.x在Visual Studio 2005/2008和Visual Studio 2010配置方法详解
- C标准库中的快速排序(quick-sort)函数 [简单应用]
- 求一堆数中三个数的和为特定值的解
- 第十二周实验报告3
- Hough变换的实现
- 线程和线程同步(pthread)
- 地球纬度一度等于多少公里?
- C标准库快速排序函数:升(降)序排序
- 解决创建连接池出现错误
- 初学ITIL指引
- Socket编程