剑指 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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读