[剑指Offer]42-连续子数组的最大和(DP)

题目链接

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意

例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和(子向量的长度至少是1).

解题思路

思路一 O(n):
从前向后遍历,若和为负值,则更新起点;若和为正值,当出现比当前 记录和最大值变量中的最大值 大时,则更新变量。

思路二,动态规划的思路(与思路一思想一致,实现方式不同) O(n):
max[I]记录从头扫到i位置元素为止和最大值。
状态转移方程:max[i]=max[i-1]+val[i],当max[i-1]>0;max[i]=val[I],当max[i-1]<0。

代码

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        vector<int> sum;
        for(int i=0;i<array.size();++i){
            if(i==0){
                sum.push_back(array[i]);
            }
            else{
                if(sum[i-1]<=0){
                    sum.push_back(array[i]);
                }
                else{
                    sum.push_back(sum[i-1]+array[i]);
                }
            }
        }
        int maxSum;
        for(auto it=sum.begin();it!=sum.end();++it){
            if(it==sum.begin()){
                maxSum=*it;
            }
            else{
                if(*it>maxSum){
                    maxSum=*it;
                }
            }
        }
        return maxSum;
    }
};

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/10543278.html