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 ;
程序分析:
程序编写比较简单,略。