LeetCode-53. Maximum Subarray

本文介绍了一种求解最大连续子序列和的有效算法。通过对每个元素的选择进行判断,决定其加入现有子序列或单独形成新子序列,从而避免了不必要的计算。此方法简单高效,适用于解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:

这里写图片描述

Solution1 (C++):

这里写图片描述

Solution2 (C++):

这里写图片描述

算法分析:

这个题目要求的是连续序列的最大和。解法的思想非常有意思。其实我们就不断的累加nums[i],但是要注意我们不需要找到最长的子序列,只需要找到最大的和,所以首先最要紧的一个问题就是,一个集合,其子集自然有很多。但是题目解法计算了集合的和的集合不超过nums.siuze();那为什么能保证这最多nums.size()个集合的和就比剩下的(2的n次方-1-nums.size())个集合的和都大呢?
我是这样想的:
对于集合中任意一个元素,在它面前的有两条路,一条是加入之前的连续子集,另一条是独立成新的子集。那么对于这两个集合,若要判断哪个集合的和大,自然要看前一个子集的和是否大于0.如果大于0,那么第一条路产生的新子集的和大;否则,第二条路产生的新子集的和大。那么通过这种方法判断就可以过滤掉计算很多不了要的子集的和。
那么在求和过程中,不断将sum与最大值ans比较,获得最终的最大值ans就是问题的解。


后面更新,其实可以参考解法二,代码写得更直观明白。其实解法一中:sum=max(sum,o);就相当于解法二中的:curMax = curMax>0? (curMax + x):x ;

程序分析:

程序编写比较简单,略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值