最大子序和-力扣

这道题目一开始在想遇到负数就从下一个正数开始计算,并和记录的最大和相比,但有些子序列,即使子序列中存在负数,但整体的和还是最大的,不能单纯的跳过。

  • 那么只需要遍历数组,即使遇到负数也不跳过,同样加到总和中,并记录 总和,当 总和大于 最大和 时,更新最大和。
  • 当 总和 小于0 时,将总和重新置为0,之前的连续子序列总和小于0,即使后续的数再大,也会拖累其成为 最大总和。
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int sum = 0;
        int maxSum = INT_MIN;
        for(int i = 0; i < nums.size(); i++){
            sum += nums[i];
            if(sum > maxSum){
                maxSum = sum;
            }
            if(sum < 0){
                sum = 0;
            }
        }
        return maxSum;
    }
};

使用动态规划的解法:

  • dp[i] 表示包括下标i之前的最大连续子序列和为dp[i]
  • dp[i] = max(dp[i - 1] + nums[i], nums[i]);
  • 初始化 dp[0] = nums[0];
  • 从前向后进行顺序遍历
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        dp[0] = nums[0];
        int maxSum = 0;
        for(int i = 1; i < nums.size(); i++){
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            if(dp[i] > maxSum){
                maxSum = dp[i];
            }
        }
        return maxSum;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值