数组求和算法系列
一直想写一个数组求和算法系列博客,但由于自己算法能力有限,完成不了,只能完成其中简单的部分,难的部分希望有园友愿意和我一起完成。在写这篇博客的过程中借用了别人的思路,有的的确是要一定的算法和数据结构基础,特别是对递归的理解,到现在为止我觉得我还没有真正的理解递归。我一向不太喜欢废话,我的博客要么是有关分析的,要么就是源码。
下面的代码希望对你有所帮助:
1. 在排序数组中查找和为给定值的两个数字,输出一对
代码
//在排序数组中查找和为给定值的两个数字,输出一对 void FineTwo(int*A,int size,int n) { if(n<1|| size<1) { return; } int beg=0; int end=size-1; while(beg<end) { if(A[beg]+A[end]==n) { cout<<A[beg]<<"\t"<<A[end]<<endl; break; } if(A[beg]+A[end]<n) { ++beg; }else { --end; } }
2. 在排序数组中查找和为给定值的两个数字,输出所有对
代码
//在排序数组中查找和为给定值的两个数字,输出所有对 void FineAll(int*A,int size,int n) { if(n<1|| size<1) { return; } int beg=0; int end=size-1; while(beg<end) { if(A[beg]+A[end]==n) { cout<<A[beg]<<"\t"<<A[end]<<endl; ++beg; } if(A[beg]+A[end]<n) { ++beg; }else { --end; } } }
3. 输出1~M中,所有连续的和等于N的数
代码
//输出1~M中,所有连续的和等于N的数 void FindContinueSequence(int size,int n) { if(size<1|| n<1) { return; } int beg=1; int end=2; int sum=beg+end; while(beg<size) { if(sum==n) { print(beg,end); } while(sum>n) { sum-=beg++; if(sum==n) { print(beg,end); } } sum+=++end; } } void print(int beg,int end) { for(int i=beg;i<=end;i++) { cout<<i<<"\t"; } cout<<endl<<endl; }
4. 输出字符串的所有排列
代码
//输出字符串的所有排列 void Permutation(string a, int start) { int end=a.length()-1; if(start == end) { cout<<a<<endl; }else{ staticchar tmp=NULL;//静态变量的定义只执行一次,而非静态变量在递归的过程中不停的构造和析构,当然它析构得比较晚 for(int i = start; i <= end; i++) { tmp=a[start]; a[start]=a[i]; a[i]=tmp; Permutation(a, start+1); tmp=a[start]; a[start]=a[i]; a[i]=tmp; } } }
5. 输出字符串的所有组合
代码
//输出字符串的所有组合 void combine(char* str) { if(str == NULL) { return; } int length = strlen(str); vector<char> res; for(int i =1; i <= length; ++ i) { combine(str, i, res); } } void combine(char* str, int num, vector<char>& res) { if(num==0) { vector<char>::iterator iter = res.begin(); for(; iter < res.end(); ++ iter) { cout<<*iter<<"\t"; } cout<<endl; }else{ if(*str =='\0') { return; } res.push_back(*str); combine(str +1, num -1, res); res.pop_back(); combine(str +1, num, res); } }
6. 找出排序数组中所有和等于给定数的所有序列
我本来的思路是想找出由最小的一组数的和等于给定的数,然后对这一组数进行组合,得出其他的一些序列,后来发现这个思路有缺陷,就放弃了,暂时还没有想到其他的思路。
7. 找出由最小的一组数的和等于给定的数,又延伸延伸出另一个题目:在排序数组中,找出由个数最多的一组和等于给定数的序列。
我的错误代码
//arr排序数组,bSize得出的序列元素个数,sum给定数,后来发现这个思路又是错的 int* getBaseArr(int* arr,int& bSize,int sum) { int tmpSum=arr[0]; int i=1; while(tmpSum<sum) { tmpSum+=arr[i++]; } int k=0; if(tmpSum>sum) { k=tmpSum-sum; for(int j=0;j<i;j++) { if(k!=arr[j]) { continue; } k=j; --i; break; } }else{ k=i; } int* a=newint[i]; for(int j=0;j<i;j++) { if(j<k) { a[j]=arr[j]; }else { a[j]=arr[j+1]; } } bSize=i; return a; }
8. 在排序数组中,找出由个数最少的一组和等于给定数的序列。
6,7,8题,希望有兴趣的园友可以做一下
作者:陈太汉
博客:http://www.cnblogs.com/hlxs/
QQ:584917974