刷题大佬请绕过
今天看到的算法,记录下,谢谢豆包。
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
};
算法步骤
-
初始化:
current_sum初始化为数组的第一个元素。max_sum初始化为数组的第一个元素。
-
遍历数组:
-
从数组的第二个元素开始遍历。
-
对于每个元素,更新
current_sum:current_sum = max(current_sum + 当前元素, 当前元素)
-
更新
max_sum:max_sum = max(max_sum, current_sum)
-
-
返回结果:
- 遍历结束后,
max_sum即为最大子数组的和。
- 遍历结束后,
示例
假设数组为 [-2, 1, -3, 4, -1, 2, 1, -5, 4],使用Kadane算法的过程如下:
-
初始化:
current_sum = -2max_sum = -2
-
遍历数组:
-
处理
1:current_sum = max(-2 + 1, 1) = 1max_sum = max(-2, 1) = 1
-
处理
-3:current_sum = max(1 - 3, -3) = -2max_sum = max(1, -2) = 1
-
处理
4:current_sum = max(-2 + 4, 4) = 4max_sum = max(1, 4) = 4
-
处理
-1:current_sum = max(4 - 1, -1) = 3max_sum = max(4, 3) = 4
-
处理
2:current_sum = max(3 + 2, 2) = 5max_sum = max(4, 5) = 5
-
处理
1:current_sum = max(5 + 1, 1) = 6max_sum = max(5, 6) = 6
-
处理
-5:current_sum = max(6 - 5, -5) = 1max_sum = max(6, 1) = 6
-
处理
4:current_sum = max(1 + 4, 4) = 5max_sum = max(6, 5) = 6
-
最终结果为 6,即最大子数组和为 [4, -1, 2, 1]。