zoukankan      html  css  js  c++  java
  • 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;
        }
    }

  • 相关阅读:
    函数对象、名称空间与作用域
    函数
    leetcode语法练习(二)
    leetcode语法练习(一)
    字符编码与文件操作
    集合类型内置方法与总结
    列表,元组与字典类型
    数据类型内置方法之数据类型与字符串类型
    [SVG实战]饼图全面解析
    [JavaScript语法学习]重新认识JavaScript
  • 原文地址:https://www.cnblogs.com/PPGwo/p/13463807.html
Copyright © 2011-2022 走看看