最大子序和

计算值

若前一个元素大于 0,则将其加到当前元素上,最后获取被修改数组的最大值即可。

function maxSubArray(nums: number[]): number {
  for (let i = 1; i < nums.length; i++) {
    if (nums[i - 1] > 0) {
      nums[i] += nums[i - 1] 
    }
  }

  return Math.max(...nums)
}

动态规划

function maxSubArray(nums: number[]): number {
  const dp = Array(nums.length).fill(0)
  
  // 边界
  dp[0] = nums[0]
  let max = dp[0]
  for (let i = 1; i < nums.length; i++) {
    // 转移公式
    dp[i] = Math.max((dp[i - 1] + nums[i]), nums[i])
    max = Math.max(dp[i], max)
  }

  return max
}

优化:每次计算时仅需要对比上次结果即可,所以无需维护一个数组。

function maxSubArray(nums: number[]): number {
  let cur = nums[0]
  let max = cur

  for (let i = 1; i < nums.length; i++) {
    cur = Math.max((cur + nums[i]), nums[i])
    max = Math.max(cur, max)
  }

  return max
}