leetcode日志(200808) 连续数列的最大和

 

 还是随机一道简单难度的题目,依旧是数组方面,这个题意很简单就是按顺序加数组,找出最大的那一段数组的和。

最开始判断思路有些问题,说一下最开始(平角裤平角裤)的四路:从不是零的数开始判断,找到小于零的数为止。

 

乍一看没什么问题,但是如果遇到【xx,-1,100】这种就会出问题,所以还要考虑到之后的情况。

 

换一个逻辑,那就是加上nums【i】之后比nums【i】本身还要小,这样就可以不如直接用nums【i】本身前面的和都没必要留着了。

代码如下:

 public int maxSubArray(int[] nums) {
      int max=Integer.MIN_VALUE,tem=0;
      if(nums.length==1) return nums[0];
      for(int i=0;i<nums.length;i++){
          if(tem+nums[i]<=nums[i]){
              tem=nums[i];
          }
          else{
              tem+=nums[i];
          }
          if(tem>max){
              max=tem;
          }
      }
       return max;
    }

题解中还有更加规整的答案:

public int maxSubArray(int[] nums) {
    int max=Integer.MIN_VALUE, i=0,sum=0;
    while (i<nums.length) {
        if (sum+nums[i]<nums[i]) {
            sum=0;
        }
        sum+=nums[i];
        if (sum>max) {
            max=sum;
        }
        i++;
    }    
    return max;  
    }

对于给出的分而治之进阶,需要在算法学习更强之后再考虑编码实现,这里只看一看,想一想分治的思想:

每一个数据都有两个选择,与前面相连或者自己另立门户!
所以状态转移方程就是这个 dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]);

class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        if(len == 0) return 0;
        if(len == 1) return nums[0];
        int [] dp = new int[len];
        int max =  nums[0];
        dp[0] = nums[0];
        for(int i = 1;i < len;i ++){
            dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]);
            max   = Math.max(max , dp[i]);
        }
        return max;
    }
}

 

 

posted @ 2020-08-09 18:16  PPGwo  阅读(152)  评论(0编辑  收藏  举报