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