Kadane算法--最大子数组和

177 阅读2分钟

刷题大佬请绕过

今天看到的算法,记录下,谢谢豆包。

leetcode53:leetcode.cn/problems/ma…

Kadane算法:用于计算不翻转情况下的最大子数组和 Kadane算法是一种用于解决最大子数组和问题的动态规划算法。它的时间复杂度为O(n),其中n是数组的长度。这个算法的核心思想是维护两个变量:当前子数组的和(current_sum)和全局最大子数组的和(max_sum)。

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let current_sum = nums[0]; max_sum = nums[0];
    for(let i = 1; i <nums.length; i++) {
        current_sum = Math.max(nums[i],current_sum + nums[i]);
        max_sum = Math.max(max_sum,current_sum)
    }
    return max_sum
};

算法步骤

  1. 初始化

    • current_sum 初始化为数组的第一个元素。
    • max_sum 初始化为数组的第一个元素。
  2. 遍历数组

    • 从数组的第二个元素开始遍历。

    • 对于每个元素,更新 current_sum

      • current_sum = max(current_sum + 当前元素, 当前元素)
    • 更新 max_sum

      • max_sum = max(max_sum, current_sum)
  3. 返回结果

    • 遍历结束后,max_sum 即为最大子数组的和。

示例

假设数组为 [-2, 1, -3, 4, -1, 2, 1, -5, 4],使用Kadane算法的过程如下:

  • 初始化:

    • current_sum = -2
    • max_sum = -2
  • 遍历数组:

    • 处理 1

      • current_sum = max(-2 + 1, 1) = 1
      • max_sum = max(-2, 1) = 1
    • 处理 -3

      • current_sum = max(1 - 3, -3) = -2
      • max_sum = max(1, -2) = 1
    • 处理 4

      • current_sum = max(-2 + 4, 4) = 4
      • max_sum = max(1, 4) = 4
    • 处理 -1

      • current_sum = max(4 - 1, -1) = 3
      • max_sum = max(4, 3) = 4
    • 处理 2

      • current_sum = max(3 + 2, 2) = 5
      • max_sum = max(4, 5) = 5
    • 处理 1

      • current_sum = max(5 + 1, 1) = 6
      • max_sum = max(5, 6) = 6
    • 处理 -5

      • current_sum = max(6 - 5, -5) = 1
      • max_sum = max(6, 1) = 6
    • 处理 4

      • current_sum = max(1 + 4, 4) = 5
      • max_sum = max(6, 5) = 6

最终结果为 6,即最大子数组和为 [4, -1, 2, 1]