leetcode学习记录--最大子数组和

本文介绍了如何通过动态规划算法解决给定整数数组中找到具有最大和的连续子数组问题,通过维护cur_sum和max_sum变量来跟踪当前子数组和以及全局最大和,避免了对负数的过度过滤。

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

题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

心路历程:

  1. 最初想着求最大子数组的和,那如果第一个数为负数,肯定得舍掉,然后又进一步想第二个数如果是负数肯定也不行。所以就对最初的负数进行了过滤,但发现这样还是有很多的漏洞,比如说绝对值很大的负数在中间怎么办呢,那这个方法就得pass掉。

  2. 这个时候就得转变一下思想,理清一下得出最大和过程中需要看哪些量,首先要一个变量cur_sum作为当前连续的子数组和,这个连续不一定是从第一个元素开始,可以从中间开始,但一定要连续。这时候还是在对数组的循环当中,遍历到 nums[i] 的时候,cur_sum是 nums[i] 之前的连续子数组和,那如果说cur_sum+nums[i]的值比起_nums[i]_还要小的话,那相当于说之前的cur_sum对nums[i]起到了一个负增长的的作用,所以这个时候就把nums[i]直接赋值给cur_sum。

  3. 试着想这么一种情况 3 5 -9 2,在运行完_2_的时候,cur_sum的值将变为2,但最大连续和应该是8,所以在运行中还要加上一个变量max_sum。

上代码(借鉴了leetcode的官方解)

动态规划算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值