1、分析:
//之前在剑指offer上看到这个问题,感觉它实现的代码让我有一些难理解,所以看了它上面的思路自己实现了一下,个人感觉比他写的代码好理解点,所以就分享哈,如果有不正确的,欢迎提出意见
2 #include <iostream>
3 #include <assert.h>
4 using namespace std;
5
6 //连续子数组中最大和
7 //思想:从第一个第一个数开始往后进行加,如果相加的结果小于当前值
//把当前值保存起来,然后再往后加,如果相加结果已经小于零了,就抛弃之前所有加的结果
8 int get_sum(int *arr,int len)
9 {
10 assert(arr !=NULL);
11 assert(len >0);
12 int max=0;
13 int tmp=0;
14 //{1,-2,3,10,-4,7,2,-5};
15 for(int i=0; i<len; ++i)
16 {
17 if(max >tmp)//首先记录当前最大的max值,因为有可能相加后会比本身的max小
18 {
19 tmp=max;
20 }else if(max <0)//如果已经小于零了,就让max从零开始继续往后相加
21 {
22 max=0;
23 }
//这是相加的结果,相加后有三种情况:1、比之前值大,2、比之前值小,3、直接小于零
24 max+=arr[i];
25 }
26 return tmp;
27 }
28 int main()
29 {
30 int arr[]={1,-2,3,10,-4,7,2,-5};
31 int len=sizeof(arr)/sizeof(*arr);
32 int max_sum=get_sum(arr,len);
33 cout<<"max sum is :"<<max_sum<<endl;
34 return 0;
35 }