leetcode53. 最大子数组和

记录一下小白刷题,今天是2023年4月28日。

        今天刚打了一场acm校赛,感觉自己算法还没入门(蓝桥杯也只拿了个省三),因此正式开启自己的刷题之路,这段时间可能会更新的比较慢:1.6级马上来了,6级还是想冲个600+。2.6月份左右还有一个期末考试,绩点一定要稳在学院第一,这样才能继续保持自己的优势,保持一下绩点。3.这个学期的专业课实在太多,三门408,外加一门数学和编译原理,实验做不完,实验报告也写不完。

        废话少说,从leetcode的最大子数组和开始。

        乍一看,我这个只会暴力的垃圾是真的觉得难,只能靠题解而活。该题采用动态规划的方法。我们可以用 f(i) 代表以第 i 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:max(f(i))。而f(i)又是怎么来的呢?显然,f(i)要么是由f(i - 1) + nums[i]得到或者直接由num[i]单独成为一段。因此该动态规划的方程为:

f(i)=max{f(i−1)+nums[i],nums[i]}

ac代码:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        int ans = nums[0]; // 排除只有一个数的这种特殊情况
        
        for(int i = 1;i < nums.size();i++)
        {
            res = max(res + nums[i],nums[i]); // 动态转移方程
            ans = max(ans,res); // 求最大的f(i)
        }
        return ans;
    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值