【LeetCode】Maximum Subarray(最大子序和)

83 篇文章 1 订阅
39 篇文章 0 订阅

这道题是LeetCode里的第53道题。

题目描述:

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

简单的动态规划题,如果之前接触过动态规划的话很容易得出答案,没有的话估计得想一阵子。

不多废话,我先介绍一下什么是动态规划吧:动态规划(Dynamic Programming)是一种分阶段求解决策问题的数学思想。总的来说就是“大事化小,小事化了”。

动态规划中包含的三个重要概念:

  1. 最优子结构
  2. 边界
  3. 状态转移方程

就拿这道题目来说,假设输入[-2,1,-3,4,-1,2,1]数组,要求其连续子数组的最大和。那它的最优子结构是什么?注意到题目要求的是连续子数组最大和。既然这样,那么求[-2,1,-3,4,-1,2,1]的连续子数组的最大和,去掉其最后一位,就可以转为求[-2,1,-3,4,-1,2]的连续子数组的最大和,因为这样可以保证它是连续的。而求[-2,1,-3,4,-1,2]的连续子数组的最大和,又是求[-2,1,-3,4,-1]的连续子数组的最大和。这样一步一步简化它。边界就是问题的范围,不可能是无穷大。这个题目的边界就是原数组的长度7。而状态转移方程呢?这是最难找的。在这里我们假设res变量保存结果即最大和,sum变量保存子结构的连续和。就拿这个例子来说。

第一步:sum<0,sum=1,sum>res→res=sum=1(sum初值为-2,res初值为0)

第二步:sum>0,sum=sum+(-3)=-2,sum<res→res=res=1

第三步:sum<0,sum=4,sum>res→res=sum=4

第四步:sum>0,sum=sum+(-1)=3,sum<res→res=res=4

第五步:sum>0,sum=sum+2=5,sum>res→res=sum=5

第六步:sum>0,sum=sum+1=6,sum>res→res=sum=6

到达边界结束

代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        int sum = 0;
        for(int num : nums){
            if(sum > 0)sum += num;
            else sum = num;
            res = res>sum?res:sum;
        }
        return res;
    }
};

第六行的代码是一个迭代器遍历,对于数组来说,等同于

for(int i=0;i<nums.length;i++){

    int num=nums[i];

    ......

}

运行结果:

个人总结:

第一次正式接触动态规划题目,感觉动态规划题是我的短板,需要多加练习。这次也学到了新语法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值