Top 150 · Kadane 算法(2 题)
最大子数组和及其环形变体。
本模块共 2 题,属于 LeetCode 面试经典 150 题 系列。
53. 最大子数组和
难度: 中等
力扣做题思路
动态规划nums[i]变成位置i前最大的数组和
代码
class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
if(len == 1){return nums[0];}
int pre = nums[0];
for(int i =1;i<len;i++){
if(pre >0){
nums[i]+=pre;
}
pre = nums[i];
}
int ans = nums[0];
for(int i =0;i<len;i++){
ans = Math.max(ans,nums[i]);
}
return ans;
}
}复杂度
- 时间:
- 空间:
备注
918. 环形子数组的最大和
难度: 中等
力扣做题思路

Case 1:直接最大子数组和。 Case 2:跨环时,最大子数组 = 总和 − 最小子数组和。 Special Case: 全部为负数时,Case1正常,输出负数;Case2恒输出0,最大和应该是Case1的输出
代码
class Solution {
public int maxSubarraySumCircular(int[] nums) {
int total =0;
int maxSum =nums[0];
int minSum =nums[0];
int curMax = 0;
int curMin = 0;
for (int a : nums) {
curMax = Math.max(curMax + a, a);
maxSum = Math.max(maxSum, curMax);
curMin = Math.min(curMin + a, a);
minSum = Math.min(minSum, curMin);
total += a;
}
return maxSum >0? Math.max(maxSum,total-minSum):maxSum;
}
}复杂度
- 时间:
- 空间:
备注
本质是上一题的贪心做法,证明思路比较重要