剑指 Offer 42. 连续子数组的最大和
2020-07-08 本文已影响0人
bangbang2
image.png
解题思路
首先看清题目
求连续子序列
可以考虑动态规划,dp[i]来保存,前i个数字的连续序列和
如果dp[i-1]>0,说明可以继续加元素,dp[i]=nums[i]+dp[i-1]
如果dp[I-1]<=0,说明从当前第i个元素开始累加
剩余的来看注释
为什么需要int max=nums[0];?
如果输入为[-2,-1],但max默认初始值为0,在max=Math.max(max,dp[i]),比较时,可能出现max=0,这样不符合题意
为什么dp[0]=nums[0];?
因为遍历是从第2个元素开始的,所以遍历第二个元素时,会比较dp[i-1]>0是否成立,否则的话dp[0]=0,该等式永远不成立
不符合题意
代码
class Solution {
public int maxSubArray(int[] nums) {
int a=nums.length;
int [] dp=new int[a];
int max=nums[0];
dp[0]=nums[0];
if(a==1) return nums[0];
for(int i=1;i<a;i++){
if(dp[i-1]>0) dp[i]=nums[i]+dp[i-1];
else dp[i]=nums[i];
max=Math.max(max,dp[i]);//获取最大值
}
return max;
}
}