• 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;
        }
    }

  • 相关阅读:
    HTML5 h1多层次样式问题
    spellcheck
    Favicon
    设计模式
    CSS 宽高的计算
    行高计算
    White-space 属性
    简约插件Plug-in for simple
    js类型及其判断
    前端路由
  • 原文地址:https://www.cnblogs.com/PPGwo/p/13463807.html
Copyright © 2020-2023  润新知