首页 > 代码库 > 求最大子序列和

求最大子序列和

问题: 求最大子序列的和

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

最大子序列和:整数序列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, 因为它只需要扫描一次数组,没有引入额外的存储空间。所以时间复杂度和空间复杂度都是最低的。

 

求最大子序列和