53. 最大子序和

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

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
//感想:这道题拿到手首先想到了很多东西,比如说动态规划,双指针,滑动窗口,感觉啥都像,又啥都不像,先是觉得动态规划应该可以,但是我TM的想歪了,我真是个睿智。。。。
我觉得应该这么考虑:用一个二维数组来保存所有东西,也就是一个[n][n]这么大的数组,然后从1个元素开始往上填,先是找一个元素的最大值再找两个到三个。。。
这样我觉得肯定没问题,应该是可以做出来的,但是这TM不就是暴力法吗?我饱了,我自己真TND下饭看,给自己看傻了。。。。
不行就试试别的,然后是滑动窗口,仔细想想,感觉这东西还是暴力,感觉好像没什么区别,那就再想想其他的。。。
又想到了买股票的有还是没有,当我沿着这条路走的时候,我发现,如果你昨天不要的话,然后保存的是个正数的话,你想用昨天的那个正数加上今天的这个正数,这TM的好像不对唉。。
你昨天都不要了,你今天要了,那肯定就不连续了啊,我发现了一个多么吊的事实啊。。(哭晕)
然后就是正确的解法了:
对于每个元素,当我们遍历到的时候,我们必须要,如果这样的话,那么如果昨天的是正数,我们就可以直接加上了,如果是负数,那么昨天的我们就不要,只要今天的,我
TM的好机智啊。总算是成功的写出来了,不容易啊。。。。
下面是代码:如果有不明白的地方,欢迎交流进步。。。
 1 class Solution {
 2     public int maxSubArray(int[] nums) {
 3         if(nums==null||nums.length==0)
 4             return 0;
 5         int[] dp=new int[nums.length];
 6         dp[0]=nums[0];
 7         for(int i=1;i<nums.length;i++)
 8             dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
 9         int res=dp[0];
10         for(int i=1;i<nums.length;i++)
11             res=Math.max(res,dp[i]);
12         return res;
13     }
14 }


原文地址:https://www.cnblogs.com/cold-windy/p/11740811.html