zoukankan      html  css  js  c++  java
  • LeetCode 53题 最大子序和 -- JavaScript

    解题思路分析:

    该题是在一个整数数组中找到一个和最大的连续子数组,并返回和值。那么如何找到一个和最大的连续子数组呢?我们知道,这肯定需要遍历数组才行;好,那我们就开始遍历数组。首先,我们初始化最大和 sum 和当前和 currSum,对于 currSum,如果它小于0,我们就将数组中下一值赋给它;否则就将数组中下一值与其相加。然后,我们取当前 sum 和 currSum 的最大值即可。

    代码实现:

    var maxSubArray = function(nums) {
      //首先判断nums是否非空
      if(nums){
        //初始化最大和sum、当前和currSum
        var sum = nums[0];
        var currSum = nums[0];
        for (var i = 1; i < nums.length; i++) {
          //取得当前和currSum
          currSum = currSum < 0 ? nums[i] : currSum + nums[i];
          //取得最大和sum
          sum = Math.max(currSum,sum)
        }
        return sum;
      }
    };

    执行步骤分析:

    我们以输入数组 nums = [-2,1,-3,4,-1,2,1,-5,4] 为例,分析一下执行流程:

    初始化:currSum = -2,sum = -2,
    nums[1]:因为 currSum = -2 < 0,故 currSum = nums[1] = 1;sum = Math.max(1,-2) = 1,
    nums[2]:因为 currSum = 1 > 0,故 currSum = currSum + nums[2] = -2;sum = Math.max(-2,1) = 1,
    nums[3]:因为 currSum = -2 < 0,故 currSum = nums[3] = 4;sum = Math.max(4,1) = 4,
    nums[4]:因为 currSum = 4 > 0,故 currSum = currSum + nums[4] = 3;sum = Math.max(3,4) = 4,
    nums[5]:因为 currSum = 3 > 0,故 currSum = currSum + nums[5] = 5;sum = Math.max(5,4) = 5,
    nums[6]:因为 currSum = 5 > 0,故 currSum = currSum + nums[6] = 6;sum = Math.max(6,5) = 6,
    nums[7]:因为 currSum = 6 > 0,故 currSum = currSum + nums[7] = 1;sum = Math.max(1,6) = 6,
    nums[8]:因为 currSum = 1 > 0,故 currSum = currSum + nums[8] = 5;sum = Math.max(5,6) = 6,
    循环结束,最终返回 sum = 6
    通过以上执行流程的分析,应该比较清晰了。一句话概括,我们利用 currSum 是为了保证子数组连续,而sum 中保存的值,就是最大连续子数组的和。

    该算法的时间复杂度为:O(n) 

    该算法的空间复杂度为:O(1) 

  • 相关阅读:
    两行文字,溢出隐藏,并显示省略号
    vue的操作:使用手机访问电脑的页面做法如下:
    width: calc(100%
    路由配置
    安装node.js 和 npm 的完整步骤
    懒加载图片轮播,总结完美可用
    Canvas 总结,到第4章 canvas图形变换
    封装表单自定义错误信息。(阻止默认错误信息提示,添加自定义错误信息提示)
    判断指定对象是否进入浏览器可视窗口,true 进入,false 没进入
    单张图片,多张图标为一个轮播对象的轮播图:按需加载 和 非按需加载
  • 原文地址:https://www.cnblogs.com/liutianzeng/p/10492307.html
Copyright © 2011-2022 走看看