开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
引言
算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。
题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入: nums = [1]
输出: 1
示例 3:
输入: nums = [5,4,-1,7,8]
输出: 23
分析
根据题目的分析,我们如何完成最大子数组的和解决?通过分析我们可以轻松的利用动态规划的思想完成题目的解答,其中每个位置的dp表示当前子数组位置最大的和。
- 初始化dp方程组,每个dp的位置都表示当前数组位置最大的和
- 默认标记第一个位置是最大的和
- 从第二个位置开始遍历数组,每次根据当前数组的值更新dp数组
- 返回最大的结果
解答
var maxSubArray = function(nums) {
//最大子数组的和
let max = nums[0]
for(let i=1;i<nums.length;i++) {
nums[i] = Math.max(nums[i],nums[i-1]+nums[i])
max = Math.max(max,nums[i])
}
return max
};
整体的设计是基于动态规划完成的,直接在初始的数组基础上完成dp数组的更新,时间复杂度是o(n),空间复杂度是o(1)。
总结
通过对最大子数组的和的讲解,大家学到了进行问题的解决。通过动态规划算法巧妙计算可以优雅的在低时间和空间复杂度下完成任务。