题目:
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。(吐槽:这就是力扣的简单题吗??? 我真的好菜啊)
解题思路: 这是动态规划的题目,所以我们用动态规划的套路的解决。(关于什么是动态规划可以看这个:告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我(万字长文) - 帅地的文章 - 知乎 https://zhuanlan.zhihu.com/p/91582909)
第一步:定义数组元素的含义dp[n],表示index为n时的最大子序和。
第二步:找出数组元素间的关系式,我们可以这样理解第n个时有两种情况。第一种 dp[n] = dp[n-1] + nums[n],第二种是dp[n] = nums[n]。然后我们选这两者的最大值就可以了,即:dp[n] = max((dp[n-1]+nums[n]),nums[n])
第三步:找出初始条件,即n=0时,等于本身num[0]
/**
* @param {number[]} nums
* @return {number}
*/
// 这样写更容易理解
var maxSubArray = function(nums) {
if (!nums.length)
return 0;
let res = [];
res[0] = nums[0];
let max = nums[0];
for (let i = 1; i<nums.length; i++) {
res[i] = Math.max(res[i-1] + nums[i], nums[i]);
if (res[i] > max) {
max = res[i]
}
}
return max
};
// 这样写更简单,时间消耗少。因为少了数组res = []
var maxSubArray = function(nums) {
let res = nums[0];
let max = nums[0];
for (let i = 1; i<nums.length; i++) {
res = Math.max(res + nums[i], nums[i]);
max = Math.max(res, max);
}
return max
};