求最大子序列和

问题: 求最大子序列的和

输入一组整数,求出这组数字子序列和中的最大值,只要求出最大子序列的和,不必求出最大值对应的序列。

最大子序列和:整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。

例如:

序列:-2, 11, -4, 13, -5, 2, -5, -3, 12, -9,则最大子序列和为21。

序列:0, -3, 6, 8, -20, 21, 8, -9, 10, -1, 3, 6, 5,则最大子序列和为43。

 

分析需求:

1. 需要找到一个子序列,得到该子序列的和

2. 比较子序列,得到最大的和输出.

最直接的方法: 穷举,得到所有可能的子序列的和再比较大小,得到最大的子序列和.这种方法是最容易想,最容易实现的,但是效率太低.这个题目考的是算法,我们关注的是时间复杂度以及空间复杂度.

先来看看这段代码

 1 #include "stdio.h"
 2 void main()
 3 {
 4     int Array[] = {-2, 11, -4, 13, -5, -2};
 5     int CurrentSum = 0, MaxSum = 0;
 6     int index = 0;
 7     for ( ; index < 6; index++ )
 8     {
 9         CurrentSum += Array[index];
10         if (MaxSum < CurrentSum)
11         {
12             MaxSum = CurrentSum;
13         }
14         else if (CurrentSum < 0)
15         {
16             CurrentSum = 0;
17         }
18     }
19     printf("Max Sum is %d\n", MaxSum);         
20 } 

由于这个题目只要求得到最大子序列的和,而不需要知道子序列下标的其实位置,我们只需要比较临时变量 MaxSum 和 当前和 CurrentSum 的大小,如果比当前和小,那么把当前的和值赋给临时变量。如果当前和值小于0,说明之前的这一段子序列的值不会有最大和的产生,所以将其赋值为0. (有一种比较极端的情况,就是数组里全是负数,但是本文只是给出一个思路,不会深究这个问题)

算法的时间复制度为 N, 因为它只需要扫描一次数组,没有引入额外的存储空间。所以时间复杂度和空间复杂度都是最低的。

 

转载于:https://www.cnblogs.com/danielhu83/p/6850209.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值