leetcode 53.最大子序和

本文探讨了一种使用动态规划解决连续子数组最大和问题的方法。通过保留前一个元素的值,实现快速比较,避免了不必要的计算。文章还讨论了如何避免在遇到负数时立即停止,而是继续向前寻找可能更高的值,引入了正数增益的概念,强调了数组元素的叠加效应。最终,作者通过网络资源理解并实现了这一算法,将其优化至接近90%的效率。

这道题是老师让做的,也不知道老师的要求标准是什么,反正现在讲到动态规划了吧?反正On就完事了。

先初始化一个相同大小的数组,然后进行累加,我不认为这是一个难的问题。。。

注意这是一个连续的,其实就是加起来的不丢掉,先存着,就是这样。最后来一个对比,就酱。

不行,这样不行,因为并不是只要碰到负数就停下,或许后面更高呢?对不对?所以它需要一个横向比较,也就是需要一个二维表,一直在填,因为我需要知道它会不会大于啊???也就是说,必须加到头,但这样又不行,怎么着都是n^2啊感觉,算了算了先不做了

这个题,怎么说呢,要说简单,肯定不简单,最重要的就是保留前一个的值,这样比较快,也只是刚刚能过而已,最后有一个特别大的数组,你至多n^2,空间复杂度不能n^2,否则过不了。

兄弟,刚过才是成功的一半,另外的,我们要优化到90%啊。自己没头绪了可以看看网上的。

在网上,我终于弄明白了我之前想的概念是什么:增益效果,这个增益效果是一种叠加的,类似导数,或者速度加速度之类的性质,为什么可以这么想呢?数和就相当于路程,数就相当于速度,即便速度在下降,数和仍然是在上涨的。

也不能这么说,因为最大值是每次叠加之后取最大的,确实是挺巧妙的,可移植性差,这种特性就叫做正数增益。这个可能是一种新的思想。

为什么这么说呢,考虑一个从头开始的,到某一位,sum为0了,那么自这位,一直往前,不论是多少位,它都是小于零的,你想啊,既然sum为0,那么它一定最后一位为0,如果最后一位为正数,那么就提前为负了对不对?也就是说这段数组的后半段之和,一定为负数,前半段之和,一定为正数。为什么不能倒过来呢?这是因为它以sum大于0为条件进行的扩展,一旦sum为0,它就直接设新位了,这果然是最最简单的做法了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值