LeetCode剑指offer Q42连续子数组的最大和

思路

类似于这种可分成子问题的问题,且子问题不相同的情况,一般使用动态规划。本题要求连续的子序列的最大和,那么就想到设dp[i]为以num[i]结尾的连续子序列的最大长度,这样再进行递推公式的推导。因为要求的最大长度且题目中说明数组中有正有负,所以若dp[i-1]小于等于0,则dp[i-1]肯定不会是最大和,那么他的价值则不如直接的num[i]了,所以此时直接将num[i]赋给dp[i]。若dp[i-1]大于0,则dp[i]=dp[i-1]+num[i];这个样就可以连续算出以每个num为结尾的连续子序列的最大和,然后去其中最大即可。初始化dp[0]=num[1];

代码

class Solution {
    public int maxSubArray(int[] nums) {
          int dp[]=new int[nums.length];

          dp[0]=nums[0];
          for(int i=1;i<nums.length;i++){
              if(dp[i-1]<=0){
                  dp[i]=nums[i];
              }else{
                  dp[i]=dp[i-1]+nums[i];
              }
          }
          int max=nums[0];
          for(int i:dp)
          max=max>i?max:i;
          return max;
    }

    // public int maxSubArray(int[] nums){
    //     int sum=nums[0];
    //     int max=sum;
    //     if(nums.length==1) return sum;
    //     for(int i=1;i<nums.length;i++){
    //           if(sum<=0) sum=nums[i];
    //           else sum+=nums[i];
    //           max=max>sum?max:sum;
    //     }
    //     return max;

    // }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值