注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数
题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
输入示例
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入:nums = [1]
输出:1
输入:nums = [0]
输出:0
解题思路
1、贪心算法
若当前元素之前的和小于0,则丢弃当前元素之前的数列。 很容易相当,如果之前数列的和为负数,再加上当前元素的值,肯定小于当前元素自身的值,此时就需要重新以当前元素为子序列的起始元素。
以数组 n u m s = [ − 2 , 1 , − 3 , 4 , − 1 , 2 , 1 , − 5 , 4 ] nums = [-2,1,-3,4,-1,2,1,-5,4] nums=[−2,1,−3,4,−1,2,1,−5,4] 举例。下面的表格表述了贪心算法的执行过程,第二列表示当前元素之前的子序列之和,其值与上一行的当前子序列的和是同一个值。第三列的值为第一列的值和第二列的值之和。第四列监视第三列中曾经出现的最大和。
当前元素值 | 之前的子序列的和 | 当前子序列的和 | 最大和 |
---|---|---|---|
- 2 | 0 | -2 | - 2 |
1 | -2 | 1 | 1 |
-3 | 1 | -2 | 1 |
4 | -2 | 4 | -4 |
- 1 | 4 | 3 | 4 |
2 | 3 | 5 | 5 |
1 | 5 | 6 | 6 |
- 5 | 6 | 1 | 6 |
4 | 1 | 5 | 6 |
以下是代码实现部分,思路在代码中的注释部分体现
var maxSubArray = function(nums) {
let preSum = 0 // 初始化之前的子序列的和
let result = nums[0] // 初始化最大和
for(let item of nums){ // 遍历 nums 数组
// 如果之前的子序列的和小于0,则将当前子序列的和设置为当前元素
if (preSum < 0) // 这里的 preSum 指的是之前的子序列的和
preSum = item // 这里的 preSum 指的是当前子序列的和
// 如果之前的子序列的和大于等于0,则将当前子序列的和设置为当前元素与之前子序列的和相加的数值
else
preSum += item
// 监视最大和
result = Math.max(result, preSum)
}
return result
};