目录
做题感悟
解题时可以先从人的角度出发看看这一问题该如何解决,然后再从计算机的角度出发结合编程语言的实现情况,看看是否可以暴力出来,然后可以再进一步化简
如果是思维题的化简讲究随机应变
dp二分等特定题型的化简便讲究套路了。
谢谢你听我一本正经的胡说八道
题目描述
从人的角度出发的解题思路
抛开计算机不谈,先说一下我们现实中碰到几个数让你求连续的几个数的和的最大值,怎么办,连续的序列比如 -2 1 -3 4 -1 2 1 -5 4 首先找连续序列的第一个数,只要是正常人,看到负数 -2 直接pass,只要是负数开头的序列一定会更小 ,然后直接 选1 接着就是-3 然后序列1开头也就到此为止了因为1+(-3)=-2 你如果把1+(-3)看成一个数-2 那么序列就变成了 -2 -2 4 -1 2 1 -5 4 所以我们要接着跳过-2(也就是1-3)
重新开始 选择连续序列得第一个数 4 然后 加上 -1 2 1 -5 4 然后发现在此期间最大 最大的连续子序列的和为6 {4 -1 2 1} 和{4 - 1 2 1 -5 4}
总之我们要一直保持我们当前的连续序列要大于0 ,因为如果序列小于0再加任意一个数n 那么结果均小于n ,所以当前序列小于0后我们就要舍弃这个序列了,在此期间我们要计算这个序列的最大值
代码实现思路(新手优先从这里看)
我们要创建一个变量 int sum=0;
sum记录着以nums[i]为首,nums[j]为结尾的子序列的和 i->[0,nums.length) j->(i,nums)
sum的转移方程:sum+=nums[i]
当sum<=0时我们就可以重新计算sum
先让sum=0;
然后让nums[j+1]为子序列的第一个数 sum+=num[j+1]
然后就这样从头到尾遍历nums[] 并用max=Math.max(sum,max)一直计算子序列和的最大值
class Solution {
public int maxSubArray(int[] nums) {
int sum=0;
int max=-1000000;
for (int i=0;i<nums.length;i++){
sum+=nums[i];
max=Math.max(max,sum);
if (sum<=0)
{
sum=0;
}
}
return max;
}
}