力扣每日一题-3-53.最大子数组和

2022.5.18今天你刷题了吗?


题目

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

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

分析

这个解法是我看别人的。它的思路是通过两个数

sum:用来遍历数组

res:用来记录最的子数组和

首先把sum和res设置为nums【】的第一个元素,利用max求最大也就是nums【】第一个元素。

然后判断第一个元素的正负,如果为正则加上nums【】第二个元素,如果为负则把nums【】第二个元素赋值给sum。

因为:如果第一个为负,则不用去加下一个元素了,直接去把下一个元素赋值给它!!!就好比。举个例子,第一个元素=-3,第二个为-4,-2,2三种情况

-4情况:sum此时=-4,然后通过max比较,保留之前的res还是=-3

-2的情况:sum此时=-2,然后通过max比较,之前的res=-2

2的情况:sum此时=2,然后通过max比较,之前的res=2

核心思想在于利用了一个res记录最大值以及判断当前的sum为正还是为负,为正数就可以交,就算加的结果变小,还有res保留上次最大。为负数就不用加了,直接取值就行,因为下一个数如果比你大,还不如直接就取它作为最大值,比你小,就不变

解析

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
    int sum=0;//遍历数组
    int res=nums[0];//存放大值
    for(int num : nums)
    {
        if(sum>0)
        {
            sum+=num;
        }
        else
        {
            sum=num;
        }
        res=max(sum,res);
    }
    return res;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值