面试经典 150 题-Kadane
LeetCode 面试经典 150 题-Kadane
最大子数组和
动态规划
- 划分阶段:按子数组结尾的位置划分阶段。
- 定义状态:dp[i]表示以nums[i]结尾的最大子数组和。
- 状态转移方程:dp[i] = max(dp[i-1], 0) + nums[i]。
- 初始条件:dp[0] = nums[0]。
- 返回结果:维护一个最大和变量。
1 |
|
- 时间复杂度:O(n)
- 空间复杂度:O(n)
分治法
维护四个变量:
- lSum:以l为左端点的最大子段和,lSum要么等于左子区间的lSum,要么等于左子区间的iSum+右子区间的lSum,取较大值。
- rSum:以r为右端点的最大子段和,rSum要么等于右子区间的rSum,要么等于右子区间的iSum+左子区间的rSum,取较大值。
- mSum:[l,r]区间内的最大和,它要么等于左子区间的mSum,要么等于右子区间的mSum,要么横跨两区间,即左子区间的rSum + 右子区间的lSum,三者取较大值。
- iSum:[l,r]区间的和,等于左子区间的iSum + 右子区间iSum。
- 用结构体定义线段树的这4个状态;
- 定义线段树的pushup操作:即给定状态left和right,计算合并后的状态。
- 定义获取子区间的和的函数:给定数组和左右下标,递归计算左右子区间状态,返回合并后的状态。
- 返回结果:get(nums, 0, nums.size() - 1).mSum;
1 |
|
- 时间复杂度:O(n)
- 空间复杂度:O(logn)
环形子数组的最大和
Kadane
最大的环形子数组和 = max(最大子数组和,数组总和-最小子数组和)。如果数组的所有数都是负数,第一种情况sum会等于数组中的最大值,而对二种情况sum=0(最小的子数组就是本数组,total-total=0)。所以多加一个case,判断最大子数组和是否小于0,小于0,直接返回该maxSubArray。
1 |
|
- 时间复杂度:O(n)
- 空间复杂度:O(1)
总结
Kadane 算法(Kadane’s algorithm)是一种用于解决最大子数组问题的动态规划算法。最大子数组问题的目标是在一个整数数组中找到一个连续的子数组,使得该子数组的和最大。
Kadane 算法的思路很简单:从头到尾遍历数组,用两个变量maxSum和curMax分别记录全局最大子数组的和以及当前最大子数组的和,每次遍历更新这两个变量即可。
面试经典 150 题-Kadane
http://example.com/2025/02/27/posts/hot150-13/