最大子序列和问题以及确定序列起终点位置

在学习数据结构遇到的第一个问题就是一个最大子序列和的问题,以PAT(点击打开链接)上的一道题作为例子来总结一下求解这类问题时一些常用的方法。网上讲述子列和问题的博客及文章已经很多了,这里就不在阐述穷举法和递归法的方式来求解了,有需求的小伙伴可以去谷歌然后百度一下。这篇博文重点讲解一下最优时间复杂度的的线性处理方式和一点点关于这个问题的扩展。

首先上的这幅图就是PAT上的那道题,想深入了解就自己点上面给的链接。

线性处理的原理:如果某个子列和的值为负数,则最大子序列和的起点肯定不会在这个子序列中。从左到右记录当前子序列的和sum,如果后面的数一直为正数,那么最大子序列的和max也不断增加,同时不断更新max值。如果遇到负数,那么当前子序列的和将会减小。此时sum 将会小于max,当然max也就不更新。如果sum ≤ 0时,说明前面已经扫描的那一段就可以抛弃了,这时将sum置为0。然后,sum将从后面开始将这个子段进行分析,分析方式与上述相同。

此题处理代码:

#include <iostream>
using namespace std;
int 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值