算法笔记整理

来源:互联网 发布:京东有类似淘宝联盟 编辑:程序博客网 时间:2024/06/06 19:30

今天主要看了以下内容:

1.寻找和为定值的多个数算法,以中兴面试题为例,即:输入两个整数,从数列1,2,3……n随意取几个数,使其和等于m,要求将其中所有的可能的组合列出来。

使用了STL 的list结构。具体代码如下:

#include<list>  #include<iostream>  using namespace std;    list<int>list1;  void find_factor(int sum, int n)   {  cout<<"传入的参数为:"<<sum<<"  "<<n<<endl;    // 递归出口      if(n <= 0 || sum <= 0)          return;            // 输出找到的结果      if(sum == n)      {          // 反转list          list1.reverse();          for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)              cout << *iter << " + ";          cout << n << endl;          list1.reverse();          }      list1.push_front(n);   for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++)              cout <<"插入后列表值为:"<< *iter << "  ";       find_factor(sum-n, n-1);   //放n,n-1个数填满sum-ncout<<"递归1"<<endl;    list1.pop_front();      find_factor(sum, n-1);//不放n,n-1个数填满sum   cout<<"递归2"<<endl;}    int main()  {      int sum, n;      cout << "请输入你要等于多少的数值sum:" << endl;      cin >> sum;      cout << "请输入你要从1.....n数列中取值的n:" << endl;      cin >> n;      cout << "所有可能的序列,如下:" << endl;      find_factor(sum,n);      return 0;  }  
2.求连续子数组的最大和问题

(1)既有负数又有正数

#include<iostream>using namespace std;int maxsum(int* a,int n){int sum=0;int b=0;for(int j=0;j<n;j++){if(b<0)b=a[j];elseb+=a[j];if(sum<b)sum=b;}return sum;}int main(){int a[10]={1,-2,10,4};cout<<maxsum(a,5)<<endl;return 0;}


(2)处理全部负数数组,返回最的负值

#include<iostream>using namespace std;#define n 4int maxsum(int a[n]){int max=a[0];int sum=0;for(int j=0;j<n;j++){if(sum>=0)sum+=a[j];elsesum=a[j];if(sum>max)max=sum;}return max;}int main(){int a[10]={-1,2,-3,-4};cout<<maxsum(a)<<endl;return 0;}

3.学习了亲合数问题(转自360百科)

自然数220与284之间,有一种非常奇妙的关系,能够整除220的全部正整数(不包括220)之和1+2+4+5+10+20+11+22+55+110恰好等于284;而能够整除284=22×71的全部正整数(不包括284)之和1+2+4+71+142又恰好等于220。这是绝妙的吻合!数学上,具有这样特征的数叫“亲合数”。毕达哥拉斯发现的220与284,是人类认识的第一对亲合数,也是最小的一对亲和数

4.学习了虚函数相关问题,讲的非常透彻

详细内容见:http://blog.csdn.net/v_july_v/article/details/6446364

0 0