详解Kadane算法(附C++实现)—— 一维最大子段和最优解法

核心问题:给定一维数组(可含正、负、零),求连续子段的最大和。Kadane算法是最优解,时间复杂度O(n)、空间复杂度O(1),简洁高效,是算法笔试高频考点。

一、Kadane算法核心思想

核心:贪心+动态规划,遍历数组时,每步选择“延伸当前子段”或“重新开始子段”,同步记录全局最大和。

核心逻辑:

  1. 用两个变量分别记录「局部最优(当前子段最大和)」和「全局最优(整个数组最大和)」;

  2. 遍历数组,每步更新局部最优,再同步更新全局最优;

  3. 无需额外空间,一次遍历完成求解。

二、模板代码逐行解析(核心重点)

结合二维最大子矩阵和模板中Kadane实现,逐行拆解核心代码:

// Kadane算法:求一维数组arr的最大子段和
int current = arr[0], max_sub = arr[0];
for (int c = 1; c < n; ++c) {
    current = max(arr[c], current + arr[c]);
    max_sub = max(max_sub, current);
}

1. 变量初始化

int current = arr[0], max_sub = arr[0];
  • current:局部最优,当前子段的最大和,初始化为数组第一个元素;

  • max_sub:全局最优,整个数组的最大子段和,初始化为数组第一个元素;

  • 关键:不能初始化为0(避免数组全负时出错,如[-5,-3,-2],最大和为-2)。

2. 核心循环


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值