LeetCode 贪心专题 53 最大子序和 题解

写在前面

之前我都是针对专题来写刷题博客的,这样一次要写10多题,而且有些题其实并不是很想写,思路很舒服的题写了埋在里面也没人看,所以现在就打算改变策略,把特别好的题单独拿出来写,这样便于检索,也减轻自己的负担。同时也能针对单个题,写的更清晰

题目详情

这一题为啥要写呢,我是觉得本题的贪心思想很好,同时它的题目要求输出很简单,是最大值,而不是说要求具体范围,只要求最大值时很多时候我们只需要一个数去记录它就ok,而不用关心那么多,整体的思路就很清晰。
所以这道题我记录它的目的在于,有些问题,明明很简单,不需要复杂的去想,就简单的朝着题目目标走就ok了。

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

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

分析

针对该题,我们以人的视角走一遍示例,来感受一下逻辑。
首先看到-2,选这个的话,现在的和为-2;
往下走,看到1,此时,我们肯定要丢弃-2,只选1,现在的最大和为1,为什么呢,因为-2+1<1。那么选-2和1,我还不如只选1。其中的原因在于-2<0;
继续往下走,看到-3,此时我们的和是1±3,=-2,最大值那肯定还是刚才的1了;
看到4,那么此时我们的和是-2+4<4,这就很没必要了,我们需要丢弃-2,让当前和为4,那么此时最大和为4了;
然后看到-1,一样的操作,当前我们的和为3,最大和依然为4,;
然后看到2,当前和变成5,最大和也更新为5;
看到1····;
看到-5,当前和变成1,最大和不变,为6;
看到4,当前和变成5,最大和不变,为6。

这样的逻辑走下来,实际上是没有问题的。这里的贪心在于,只要之前的和<0那么就丢弃,为什么呢?因为 之前和+当前值<当前值。所以我们需要将之前的和都丢掉。
而若之前和是正数,当前值确实一个不小的负数时呢?比如上面示例的-5,这个该怎么办呢,这个不用担心,因为我们要的只是最大值,所以我们每一次都记录下最大值,即使 之前和+当前值<0 也无妨,最大值不会变,而且这这能说明,这个连续的最大值最多只能走到当前了,所以丢弃从前,从新开始统计和就行。而若之前和+当前值>0,那就继续走着,也 不用担心。

在这种题里,包括股票题,一定要抓住负数的意义。

代码实现

把上面的逻辑直接复现就ok了。

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0]; //存储最大值
        int sum = 0; //存储当前和
        int index = 0; //遍历索引
        while(index<nums.length){
            if(sum<0){//当之前和<0,则丢弃
                sum = nums[index];
            }
            else {
                sum += nums[index];
            }
            max = Math.max(max,sum);
            index++;
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值