!!!题解 | 连续子数组的最大和 妙 一开始没啥思路 可以多看看这道

连续子数组的最大和

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484

#include <climits>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        //不能排序 会破坏数组之间的邻居关系
        //没啥思路
        /*能够想到的是,可以以当前元素作为这个目标序列的结尾。
        但是这样DP数组应该定义为什么呢,他肯定要继承前面的那个数字,
        但是这样的话是不是就觉得,只能是从开头起到这个元素的和,不知道从哪里断掉,没有办法对这个数列从哪里开头进行操作?
        先看一个例子,就是这个数组是从左往右遍历的,我们不知道右边的序列是怎么样的,只知道最左边的是一个正数还是负数,那么我们还要不要以左边这个负数为这个序列的开头?
        不可以,因为加入它就会让这个最大和变小,所以不应该以左边那个负数开头,
        而应该以当前元素开头。所以这样就对这个子数组从哪里开头做了正确的处理。
        */
        int size=array.size();
        if(size==1)return array[0];
        int res=INT_MIN;//这里其实可以让它等于dp0;就不用做上面那个判断了
       
        //长度最小=1.
        vector<int> dp(size);
        dp[0]=array[0];
        for(int i=1;i<size;i++){//从1开始是正确的
            if(dp[i-1]>0)dp[i]=dp[i-1]+array[i];
            else{
                dp[i]=array[i];
            }
            if(dp[i]>res)res=dp[i];
        }
        return res;
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务