【动态规划】LeetCode 53 最大子序和-Easy

130 阅读1分钟

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

动态规划四步走

1. 定义状态
2. 初始状态
3. 状态转移方程
4. 从dp[]中获取结果

具体到题目

定义状态

dp[i] 表示所有0到i的元素组成的数组中最大子序和;

初始状态

dp[0] = nums[0]

状态转移方程

如果dp[i-1]大于0,那么很显然dp[i]的值就是在其基础上再加上一个nums[i];而当dp[i-1]小于0,那么dp[i-1]与nums[i]两者的和显然不如nums[i]本身的大,由于我们要连续数组最大和,所以直接抛弃这段就可以了,从当前元素nums[i]开始累计。 因此,转移方程为:dp[i] = max{dp[i-1],0} + nums[i];

从dp[]中获取结果

dp[]中找到最大值的就是最后的结果

代码示例

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
  if (!nums.length) {
    return;
  }
  const dp = [nums[0]];
  let ans = nums[0];
  for (let i = 1; i < nums.length; i++) {
    dp[i] = Math.max(dp[i - 1], 0) + nums[i];
    if (dp[i] > ans) {
      ans = dp[i];
    }
  }
  return ans;
};