美文网首页
剑指 Offer 42. 连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和

作者: bangbang2 | 来源:发表于2020-07-08 11:17 被阅读0次
    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指 Offer 42. 连续子数组的最大和

          本文链接:https://www.haomeiwen.com/subject/ikiqcktx.html