在学习数据结构遇到的第一个问题就是一个最大子序列和的问题,以PAT(点击打开链接)上的一道题作为例子来总结一下求解这类问题时一些常用的方法。网上讲述子列和问题的博客及文章已经很多了,这里就不在阐述穷举法和递归法的方式来求解了,有需求的小伙伴可以去谷歌然后百度一下。这篇博文重点讲解一下最优时间复杂度的的线性处理方式和一点点关于这个问题的扩展。
首先上的这幅图就是PAT上的那道题,想深入了解就自己点上面给的链接。
线性处理的原理:如果某个子列和的值为负数,则最大子序列和的起点肯定不会在这个子序列中。从左到右记录当前子序列的和sum,如果后面的数一直为正数,那么最大子序列的和max也不断增加,同时不断更新max值。如果遇到负数,那么当前子序列的和将会减小。此时sum 将会小于max,当然max也就不更新。如果sum ≤ 0时,说明前面已经扫描的那一段就可以抛弃了,这时将sum置为0。然后,sum将从后面开始将这个子段进行分析,分析方式与上述相同。
此题处理代码:
#include <iostream>
using namespace std;
int