[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, 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,1,-3,4,-1,2,1,-5,4]
为例。
-
子数组和为 -2
此时最大子数组和为 -2
-
这时候就碰到了 1.1 的情况,没有必要保留 − 2 + 1 -2 + 1 −2+1 这个配对,而是可以直接取 1 1 1 本身
此时最大子数组和为 1
-
此时碰到了 1.2 的情况,保留当前子数组和
此时最大子数组和为 1
-
此时又碰到了 1.1 的情况,没有必要保留 1 + − 3 1 + -3 1+−3 这个配对,可以直接取 4 4 4 本身
此时最大子数组和为 4
-
遇到 1.2 这个情况,依旧保留当前子数组和
此时最大子数组和为 4
-
碰到 2 这个情况,依旧保留当前子数组和
此时最大子数组和为 4 + − 1 + 2 4 + -1 + 2 4+−1+2
-
重复步骤…
根据这样的逻辑,就需要设两个变量,一个保存局部最大值,一个保存全局最大值。
使用 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