剑指85题解 | #连续子数组的最大和(二)#

连续子数组的最大和(二)

https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

#include <vector>
class Solution {
public:
    vector<int> FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        vector<int> dp(array.size(), 0);
        int l = 0, r = 0;
        int res1 = 0, res2 = 0, res3 = 0, res4 = 0;
        dp[0] = array[0];	//动态规划,保存已操作过的结果
        int max_val = array[0];
        int max_val_1 = array[0];
        for(int i = 1; i < array.size(); ++i)
        {
            r++;
            dp[i] = max(dp[i-1] + array[i], array[i]);
            // 更新l值
            if(dp[i-1] + array[i] < array[i]){
                l = r;  // 这不能给i,因为r一开始为0,而i一开始为1
                // std::cout << " 888 " << std::endl;
            }

            // int tmp = max_val_1;
            // max_val_1 = max(dp[i], max_val_1);
            // // 序列更新,最大值更新或者更长了~
            // if(max_val_1 > tmp || (max_val_1 == tmp && (r - l +1)> (res4 -res3+1))){
            //     res3 = l;
            //     res4 = r;
            //     std::cout <<i <<" max_val_1 : " << " " << dp[i]<< " "<< l << " " << r << " " << max_val << std::endl;
            // }    // 这种写法会报错,逻辑上个人理解没毛病,但从打印效果看最大值更新会更频繁
            // 序列更新:最大值更新,或者相等情况下,题意更长则更优
            if(dp[i] > max_val || max_val == dp[i] && (r - l +1)> (res2 -res1+1)){
                max_val = dp[i];
                res1 = l;
                res2 = r;
                // std::cout <<i <<" max_val__ : " <<  " " << dp[i]<< " "<< l << " " << r << " " << max_val << std::endl;
            }
        }
        vector<int> v;
        v.assign(array.begin()+res1, array.begin()+res2+1);
        return v;
    }
};

挤挤刷刷! 文章被收录于专栏

记录coding过程

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务