力扣53. 最大子数组和(滑动窗口,动态规划)

Problem: 53. 最大子数组和

题目描述

在这里插入图片描述在这里插入图片描述

思路及解法

思路1:滑动窗口

1.为求出最大连续的子数组和,我们逻辑上假设有一个窗口在原数组上滑动,
欲求出最大连续,则需要保证窗口中的所有元素和最起码大于0;
2.即当当前窗口中的元素值的和小于0时,直接将其窗口舍弃,并在当前位置重新开一个新的窗口;
3.在实际操作中我们可以直接利用一个值(sum)进行累加操作,并判断其正负性;同时再记录一个值maxSum用于求出最大的连续子数组和

思路2:动态规划

1.用一个数组dp记录以第 i i i个数结尾时的最大子数组和;
2.欲得出当前的最大子数组和,则需要比较*dp[i - 1] + nums[i]的值与nums[i]*的值谁更大;
3.即得出动态转移方程:dp[i] = max(dp[i - 1] + nums[i], nums[i])
4.求出dp数组中的最大值即可

复杂度

思路1:滑动窗口
时间复杂度:

O ( n ) O(n) O(n);其中 n n n为原数组 n u m s nums nums的大小

空间复杂度:

O ( 1 ) O(1) O(1)

思路2:动态规划
时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

思路1:滑动窗口

class Solution {
public:
    /**
     * Slider windows
     * @param nums Given array
     * @return int
     */
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        int maxSum = INT_MIN;
        int sum = 0;
        for (int i = 0; i < n; ++i)  {
            if (sum < 0) {
                sum = 0;
            }
            sum += nums[i];
            if (sum > maxSum) {
                maxSum = sum;
            }
        }
        return maxSum;
    }
};

思路2:动态规划

class Solution {
public:
    /**
     * Dynamic programing
     * @param nums Given arr
     * @return int
     */
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n + 1);
        dp[0] = nums[0];
        for (int i = 1; i < n; ++i) {
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
        }
        int max = INT_MIN;
        for (int i = 0; i < n; ++i) {
            if (dp[i] > max) {
                max = dp[i];
            } 
        }
        return max;
    }
};
  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值