子数组最大累加和(有正有负)

 1 /*
 2 [1,-2,3,5,-2,6,-1];  最大子数组为[3,5,-2,6] 和为12,并且能标记处最大子数组的范围
 3 */
 4 
 5 
 6 #include "stdafx.h"
 7 #include <iostream>
 8 
 9 using namespace std;
10 
11 void maxSum(int* arr,int len)
12 {
13     if(arr == NULL || len == 0)//合法性判断
14         return ;
15 
16     int cursum = 0;            //记录遍历过程中的当前和
17     int maxmark = 0x80000000;  //记录最大和
18     int begin = 0;             //标记和为最大子数组的开始位置
19     int end = 0;               //标记和为最大子数组的结束位置
20 
21     for(int i = 0; i < len; i++)
22     {
23         cursum += arr[i];
24         if(cursum <= 0)
25         {//当前和为0,则以下一个位置重新开始
26             cursum = 0;
27             begin = i+1;//标记开始位置
28         }
29 
30         maxmark = max(maxmark,cursum);
31                  //每一步都记录最大值,保证maxmark不减少
32 
33         if(maxmark == cursum)
34             end = i;
35               //向后可能和值还继续大于0,但是已经小于已有的maxNum,                           //end到此结束。
36     }
37     cout<<begin<<" "<<end<<" "<<maxmark<<endl;
38 }
39 
40 int _tmain(int argc, _TCHAR* argv[])
41 {
42     int arr[] = {1,-2,3,5,-2,6,-1};
43     maxSum(arr,7);
44     system("pause");
45     return 0;
46 }
47                     
View Code
原文地址:https://www.cnblogs.com/lp3318/p/5782289.html