最大子序列和的线性时间解法
来源:互联网 发布:wincc组态软件 编辑:程序博客网 时间:2024/05/02 00:08
问题描述:给定整数A1,A2,...An(可能有负数)。求 的最大值。(如果所有的整数都是负数,则最大子序列和为0。)
程序代码:
int maxSubSum(const vector<int>&a){int maxSum = 0;int thisSum = 0;for(int i = 0;i < a.size();i++){thisSum += a[i];//新读取一个数if(thisSum > maxSum)//这次的结果比最大序列还大{maxSum = thisSum;}if(thisSum < 0)//推进i{thisSum = 0;}}return maxSum;}
解释:
1.最大子序列的第一个元素不会是负的。即,如果a[i]是负的,那么它不可能是最大子序列的起点。因为任何用a[i]开头的序列,此时都不如用a[i+1]开头的序列和大。
2.同理,任何负的子序列都不可能是最优子序列的前缀。即,如果我们在内循环中检测到a[i]到a[j]的和是负的,那么我们可以推进i,关键的结论是我们不光可以推进到i+1,实际上我们可以直接推进到j+1。说明:令p是i+1到j之间的任何一个下标,因为j下标是第一个使从a[i]开始的序列变负的下标,所以,从a[i]到a[p]的序列和为正数。也就是说任何从p开始的子序列,都不如这个序列再加上a[i]到a[p-1]这个序列的和大。所以我们可以直接推进到j+1。
通过这个例子我们可以发现,许多聪明的算法,运行时间是明显的,本例是O(N),但是正确性不是那么明显。
0 0
- 最大子序列和的线性时间解法
- 最大子段和:线性序列的最大子段和的三种解法
- 求最大子序列的线性时间复杂度的解法的理解
- 最大子序列和问题的解(线性时间)
- 最大子序列和的线性时间算法
- 求解最大子序列和问题的线性时间算法
- 最大连续子序列最大和的四种解法
- 线性时间求解最大子序列和——HDU1003
- 最大子序列和的四种解法
- 最大连续子序列和的几种解法
- 最大子序列和的线性算法及其它算法
- 最大子序列和的线性算法及其它算法
- 最大子序列和线性算法
- 最大子序列问题,递归和线性
- 最大子序列的线性算法
- 求最大子序列的线性算法
- 最大子序列最佳解法
- leetCode解题报告之O(n)线性时间求最大子序列和(Maximum Subarray)
- Cpp模版Template-笔记
- 后台使用imagemagick的convert命令来处理图片真是太方便了。
- JAVA中的泛型
- 超全局变量数组get post requerst resver的使用规则
- 1.中医思想
- 最大子序列和的线性时间解法
- 如何从后台开启android蓝牙的可见性以及始终保持可见性
- DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
- oracle 常用数据字典、常用函数说明
- opencv3.0 beta的一些改变
- mysql触发器语法的一个实例
- nginx作为php站点的负载均衡实践
- Android常用控件的初步认识
- Java中获取路径的各种方法