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

 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 }

转载于:https://www.cnblogs.com/XjChenny/archive/2011/10/17/2215893.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值