Leetcode题解系列——53. Maximum Subarray(c++版)

本文介绍了一种使用动态规划解决最大子数组和问题的方法,通过状态转移方程优化了时间复杂度至O(n),并提供了详细的算法实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:53. Maximum Subarray

题目大意:给出一段整数数组,找出其中一段总和最大的连续子段,输出最大值。

注意点:

  1. 子序列要求连续,不能中断
  2. 判断给出数列长度为0的情况
  3. 动态规划的起点,求解过程

一.算法设计

这是一道经典的动态规划问题,当然它可以通过数组遍历的方式来暴力求解,其时间复杂度为O( n 2 n^2 n2),这显然不是我想要讨论的内容

这里利用动态规划的方式来求解
dp[i]表示以 a [ i ] a[i] a[i]结尾的最大子段和
所求的最大值为max(dp[i]), 0 < i < n;

以下是状态转移方程:

  • dp[i] = 0, 数组长度为0时
  • dp[i] = dp[i-1] + a[i], 数组长度大于0且dp[i-1]大于等于0
  • dp[i] = a[i], 数组长度大于0且dp[i-1]小于0

其时间复杂度为O(n)

二.算法实现

这里要注意初始化dp数组,将nums数组的第一个值先赋值给dp[0].
与此同时,将最大值先初始化为dp[0].

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size();
        if(len == 0) return 0;
        vector<int> dp(len);
        dp[0] = nums[0];
        int max_num = dp[0];
        for(int i = 1; i < len; i++){
            if(dp[i-1] >= 0) dp[i] = dp[i-1] + nums[i];
            else dp[i] = nums[i];
            
            max_num = max(max_num, dp[i]);
        }
        return max_num;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值