背景
Kadane算法(Kadane’s Algorithm)是一种用于解决最大子数组和问题(Maximum Subarray Sum Problem)的动态规划算法。该问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大。Kadane算法的时间复杂度为O(n),其中n是数组的长度,因此它是解决这个问题的高效方法。
实现步骤
- 初始化两个变量:currentMax(用于跟踪当前子数组的最大和)和globalMax(用于跟踪全局最大子数组的和)。初始值都可以设为数组的第一个元素。
- 遍历数组中的每个元素,从第二个元素开始:
a. 更新currentMax,将其设置为当前元素值与currentMax + 当前元素值中的较大者。这表示在当前位置考虑是否要继续扩展子数组,或者从当前位置重新开始一个新的子数组。
b. 更新globalMax,将其设置为currentMax和globalMax中的较大者。这表示我们始终跟踪最大子数组的和。 - 继续遍历数组的剩余元素,并重复步骤2。
- 返回globalMax作为最大子数组的和。
代码实现
public class KadaneAlgorithm {
public static int findMaxSubarraySum(int[] arr) {
int currentMax = arr[0];
int globalMax = arr[0];
for (int i = 1; i < arr.length; i++) {
currentMax = Math.max(arr[i], currentMax + arr[i]);
globalMax = Math.max(globalMax, currentMax);
}
return globalMax;
}
public static void main(String[] args) {
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = findMaxSubarraySum(arr);
System.out.println("最大子数组的和为: " + maxSum);
}
}
如果数列中含有负数元素,并允许返回长度为零的子数列。我们可以对以上代码稍作修改,得到以下代码:
public class KadaneAlgorithmWithZeroLengthSubarray {
public static int findMaxSubarraySum(int[] arr) {
int currentMax = 0;
int globalMax = 0;
for (int i = 0; i < arr.length; i++) {
currentMax = Math.max(0, currentMax + arr[i]);
globalMax = Math.max(globalMax, currentMax);
}
return globalMax;
}
public static void main(String[] args) {
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSum = findMaxSubarraySum(arr);
System.out.println("最大子数组的和为: " + maxSum);
}
}