kadane算法通过动态维护“以当前元素结尾的最大子数组和”在o(n)时间内求解最大连续子数组和;若前段和为正则延续,否则重启;支持空数组、全负数等边界情况。

Java 中用 Kadane 算法查找无序数组中连续子数组的最大和,核心是动态维护“以当前元素结尾的最大子数组和”,时间复杂度仅 O(n),空间复杂度 O(1),比暴力枚举(O(n²))高效得多。
算法原理:只关心“要不要接上前一个子数组”
对每个位置 i,我们不考虑所有以 i 结尾的子数组,而是判断:前面累积的和(maxEndingHere)是否大于 0?
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果 maxEndingHere > 0,说明它对当前元素有增益,就把它加上 nums[i]
- 如果 maxEndingHere ≤ 0,说明前面拖后腿,不如从 nums[i] 重新开始
- 每步更新全局最大值 maxSoFar
Java 实现代码(含边界处理)
支持空数组、全负数、单元素等常见情况:
public static int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0) {
throw new IllegalArgumentException("数组不能为空");
}
int maxSoFar = nums[0];
int maxEndingHere = nums[0];
for (int i = 1; i
关键细节与常见误区
- 不能初始化为 0:若数组全为负数(如 [-5,-2,-8]),结果应是 -2,不是 0。必须用 nums[0] 初始化
- 顺序不可颠倒:先更新 maxEndingHere,再更新 maxSoFar;否则会漏掉单个元素的情况
- 不适用于环形数组:Kadane 解决的是线性连续子数组;若需处理首尾相连场景,需额外逻辑(如总和减最小子数组和)
- 想返回子数组范围? 可同步记录起始/结束下标:当 maxEndingHere 重置时更新 left,当 maxSoFar 更新时更新 right 和 left
简单测试示例
输入:[−2, 1, −3, 4, −1, 2, 1, −5, 4]
过程:逐步计算 maxEndingHere → [−2, 1, −2, 4, 3, 5, 6, 1, 5],maxSoFar 最终为 6(对应子数组 [4,−1,2,1])
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










