Kadane算法
Kadane's算法是一种用于解决最大子数组和问题(Maximum Subarray Sum Problem) 的动态规划算法。该问题的目标是在一个给定数组中找到一个连续子数组,使得子数组的和最大。
算法的基本思想是通过迭代数组的每个元素,维护两个变量:当前最大子数组和以及全局最大子数组和。在每一步中,都考虑是否将当前元素添加到当前最大子数组和中,或者重新开始一个新的子数组。这样一步步地迭代数组,最终得到全局最大子数组和。
53. 最大子数组和
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
解法,动态规划,写出转移方程。
dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和,那么dp[i]和dp[i-1]有什么关系呢?
public class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
// dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和
int[] dp = new int[len];
dp[0] = nums[0];
for (int i = 1; i < len; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
}
// 也可以在上面遍历的同时求出 res 的最大值,这里我们为了语义清晰分开写,大家可以自行选择
int res = dp[0];
for (int i = 1; i < len; i++) {
res = Math.max(res, dp[i]);
}
return res;
}
}
空间优化算法:
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
maxAns = Math.max(maxAns, pre);
}
return maxAns;
}
}