六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)

本文详细介绍了六种不同的方法来解决连续子序列最大和问题,包括暴力解法、预处理、分治算法、累积遍历算法、动态规划以及第二种累计求和算法,每种方法都有其独特的思路和优化策略,复杂度从O(n^3)到O(n)不等。通过伪代码和例子进行了清晰的解释。
摘要由CSDN通过智能技术生成

问题描述

      连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。

      比如例如给定序列:

           { -2, 11, -4, 13, -5, -2 }

        其最大连续子序列为{ 11, -4, 13 },最大和为20。


===============================================================


问题分析

1.首先最朴素的方法是暴力 O(n^3)

       直接两个for循环枚举子序列的首尾,然后再来个循环计算序列的和,每次更新和的最大值。

        但是这种方法的复杂度是O(n^3),效率实在太低了。。。

————————————————————————————————————————————————

2.第二种方法是预处理 O(n^2)

       在读入的时候将前面数的和放在数组中,就能得到一个数组sum[i]储存前i个数的和。然后两重循环枚举首尾,利用sum数组迅速求出子序列的和。

        其实这种方法只是优化了前面那种方法的计算和的循环,复杂的是O(n^2),也很糟糕。
————————————————————————————————————————————————

3.第三种是利用分治思想 O(nlogn)

      分治算法但看代码不是很好理解,其实思想很简单,就是把序列分成两块计算,用递归分别求出两块序列中的最大子序列和,然后从序列中间向两边遍历求出包含中心的序列的最大和。返回最大的那个序列和。

       递归真的很神奇,一直把问题分解乘小问题交给下一层递归处理,直到最底层。

       用分治算法的复杂度好了一些,是O(nlogn),虽然不是最优解,但是理解这种算法的确能让我们对递归理解得更加深刻。
————————————————————————————————————————————————

4.第四种是累积遍历算法 O(n)

      遍历序列的时候对Sum进行累计,如果Sum累积后小于0的话就把Sum重置为负无穷,每次更新Sum的最大值。最后便能求出最大值。

       其实这个算法就是把序列分为好几块,每一块满足:对于任意k,前k个数的和不会小于0(小于0就会分裂成两块了),当前i个数的和大于最大值时就进行更新,而最大值的左边界就是该块序列的第一个,右边界是第i个。

       时间复杂度为O(n),而且可以一边读取一边处理,不需要开辟数组来存,空间也很省。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值