【经典数据结构算法】(3)最大子数组和

来源:互联网 发布:无法创建java虚拟机 编辑:程序博客网 时间:2024/05/16 08:03
 1 /************************************************************************/
2 /*
3 题目:
4 输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每一个子数组都有一个和。
5 求所有子数组的和的最大值。要求时间复杂度为O(n)。
6 例如:
7 输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2。
8 因此,输出为该子数组的和18.
9
10 分析:
11 可以使用Max_Sum来保存目前的最大子数组的和。假设数组的大小为n。那么从第0个开始遍历;当前子数组的和为sum。
12 初始状态下,Max_Sum=-INF(负无穷),sum=0。
13 遍历到第i(0<=i<=n)的时候,sum+=i,如果sum>Max_Sum时,将Max_Sum赋为sum。sum的值不清空,继续遍历;如果sum<0,则令sum=0,
14 此时可以考虑:和最大值要么在i的左侧,它已经被记录到了Max_Sum中;要么在i的右侧,那么此时sum的值就要被清空,重新开始计算和。
15 有没有一种可能,说和最大值既包括i的左侧和i的右侧呢?这种情况是不可能的。
16 因为i的左侧和为负值。如果左侧和右侧的和为最大,右侧的值应更大,两者相矛盾,因此这种情况是不可能的。
17 先计算Max_Sum,再判断sum的值是否小于零,包含了所有为负的情形.
18 */
19 /************************************************************************/
20
21 #include "stdafx.h"
22 #include <limits.h>
23
24
25 int CalculateMaxSum( int *intArray, int count )
26 {
27 int ret=INT_MIN;
28 int sum=0;
29 for(int i=0;i<count;i++)
30 {
31 sum+=intArray[i];
32 if(sum>ret)
33 {
34 ret=sum;
35 }
36 if(sum<0)
37 {
38 sum=0;
39 }
40
41 }
42 return ret;
43
44 }
45
46 int _tmain(int argc, _TCHAR* argv[])
47 {
48 int intArray1[]={1,-2,3,10,-4,7,2,-5};
49 printf("%d\n",CalculateMaxSum(intArray1,8));
50 int intArray2[]={-3,-2,-7,-4,-5,-2,-11};
51 printf("%d\n",CalculateMaxSum(intArray2,8));
52 return 0;
53 }

原创粉丝点击