跳至主要內容

最大子序和

linwu大约 1 分钟

最大子序和

题目描述

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

解题步骤

为了找到具有最大和的连续子数组,我们可以使用动态规划的思想来解决问题。

  1. 定义状态:我们可以将问题转化为以每个元素结尾的连续子数组的最大和。令 dp[i] 表示以第 i 个元素结尾的连续子数组的最大和。

  2. 初始状态:根据题目的约束,以第一个元素结尾的连续子数组的最大和就是第一个元素本身。即 dp[0] = nums[0]

  3. 状态转移方程:对于第 i 个元素,我们有两种选择:将其加入前一个子数组中或以当前元素为起点开始新的子数组。如果我们选择将其加入前一个子数组中,那么最大和为 dp[i-1] + nums[i];如果我们选择以当前元素为起点开始新的子数组,那么最大和为 nums[i]。因此,状态转移方程为 dp[i] = max(dp[i-1] + nums[i], nums[i])

  4. 最终解:问题的解即为所有连续子数组的最大和中的最大值,即 max(dp)

下面是使用动态规划解决最大子序和问题的算法框架:

function maxSubArray(nums) {
  const n = nums.length;
  if (n === 0) {
    return 0;
  }

  const dp = new Array(n);
  dp[0] = nums[0];
  let maxSum = dp[0];

  for (let i = 1; i < n; i++) {
    dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
    maxSum = Math.max(maxSum, dp[i]);
  }

  return maxSum;
}

关注公众号

和小伙伴们一起学习

加入技术交流群

扫描二维码 备注加群