LeetCode刷题记16-53. 最大子序和

LeetCode刷题记16

53. 最大子序和

题目
在这里插入图片描述
题解

class Solution {
    public int maxSubArray(int[] nums) {
        int min = 0;
        int ans = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = 0; i < nums.length; i ++) {
            sum += nums[i];
            ans = Math.max(sum - min, ans);
            min = Math.min(sum, min);
        }
        return ans;
    }
}

看一下别人的代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int pre = 0, maxAns = nums[0];
        for (int x : nums) {
            pre = Math.max(pre + x, x);
            maxAns = Math.max(maxAns, pre);
        }
        return maxAns;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

OK,稍做分析:这个题目吧,我之前本科刚接触算法的时候就已经打了很多很多遍了,那个时候我的思路和“别人的代码”思路一致,只是现在我忘记了。

学习期间的思路(别人的思路):
典型的动规,我好懒啊,借一下别人的图
https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/
在这里插入图片描述
OK,现在说我自己的想法(其实和动规一个道理)。
假设现在的我是一个完全不会什么算法的人,我要解决这个问题。

我会先想:区间和怎么计算,就是nums[i]+num[i+1]+…+nums[j],就是什么呢,就是sum[j]-sum[i-1](我想大家都知道sum[j]代表什么);

我们希望这个sum[j]-sum[i-1]尽可能大,那么sum[j]就越大越好,sum[i-1]越小越好;

而且j必须大于i-1,那么我们只需要在往后遍历的过程中记录一下这个最小的sum[i-1]的值就好,利用每个sum[j]减去这个最小值,更新一下答案就好。

哎,算了,这么简单的问题我讲的乱七八糟的,我果然不适合讲解,以后还是单纯记录一下好了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值