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]减去这个最小值,更新一下答案就好。
哎,算了,这么简单的问题我讲的乱七八糟的,我果然不适合讲解,以后还是单纯记录一下好了。