[JavaScript 刷题] DP - 最大子数组和, leetcode 79

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] DP - 最大子数组和, leetcode 79相关的知识,希望对你有一定的参考价值。

[javascript 刷题] DP - 最大子数组和, leetcode 79

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:

题目

如下:

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

A subarray is a contiguous part of an array.

解题思路

一道很经典的 DP 题,在寻找到子数组和的时候会出现这么两种情况:

  1. 加入当前遍历的数字会使子数组和变小

    这个情况也能分成两种条件:

    1. 加入当前值会让子数组和比自身小

      这时候就没有必要继续保留之前的子数组和,而是可以让当前值成为新的子数组,如:

      1, 2, -5, 1 中, 1 + 2 + − 5 = − 2 1+2+-5 = -2 1+2+5=2,当遍历到 1 1 1 时, 1 1 1 本身就是大于 − 3 -3 3,那么也就没有必要取 − 3 -3 3,而是直接取 1 1 1.

    2. 加入当前值,子数组和还是比自身大

      这个时候还会保留整个子数组

  2. 加入当前遍历的数字会使子数组和变大

以题目中给的 [-2,1,-3,4,-1,2,1,-5,4] 为例。

  1. 子数组和为 -2

    此时最大子数组和为 -2

  2. 这时候就碰到了 1.1 的情况,没有必要保留 − 2 + 1 -2 + 1 2+1 这个配对,而是可以直接取 1 1 1 本身

    此时最大子数组和为 1

  3. 此时碰到了 1.2 的情况,保留当前子数组和

    此时最大子数组和为 1

  4. 此时又碰到了 1.1 的情况,没有必要保留 1 + − 3 1 + -3 1+3 这个配对,可以直接取 4 4 4 本身

    此时最大子数组和为 4

  5. 遇到 1.2 这个情况,依旧保留当前子数组和

    此时最大子数组和为 4

  6. 碰到 2 这个情况,依旧保留当前子数组和

    此时最大子数组和为 4 + − 1 + 2 4 + -1 + 2 4+1+2

  7. 重复步骤…

根据这样的逻辑,就需要设两个变量,一个保存局部最大值,一个保存全局最大值。

使用 JavaScript 解题

/**
 * @param number[] nums
 * @return number
 */
var maxSubArray = function (nums) 
  let localMax = nums[0],
    max = nums[0];

  for (let i = 1; i < nums.length; i++) 
    localMax = Math.max(nums[i] + localMax, nums[i]);

    max = Math.max(localMax, max);
  

  return max;
;

以上是关于[JavaScript 刷题] DP - 最大子数组和, leetcode 79的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] DP - 买卖股票的最佳时机,leetcode 121

[JavaScript 刷题] DP - 杨辉三角, leetcode 118

[JavaScript 刷题] DP - 组成整数的最小平方数数量, leetcode 279

[JavaScript 刷题] DP - 买卖股票的最佳时机,leetcode 121

(java刷题--918环形子数组的最大和

java刷题--152乘积最大子数组