求最大子序列和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大子序列和相关的知识,希望对你有一定的参考价值。
问题: 求最大子序列的和
输入一组整数,求出这组数字子序列和中的最大值,只要求出最大子序列的和,不必求出最大值对应的序列。
最大子序列和:整数序列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, 因为它只需要扫描一次数组,没有引入额外的存储空间。所以时间复杂度和空间复杂度都是最低的。
以上是关于求最大子序列和的主要内容,如果未能解决你的问题,请参考以下文章