Kadane算法实现对特定数组计算结果错误问题排查求助
你的Kadane算法实现没有问题,输出7是正确结果,你对最大子数组和的预期判断有误。
计算验证
测试数组[2,2,2,-2,-2,3,2]的所有连续子数组中,总和最大的是整个数组本身,求和计算如下:2 + 2 + 2 + (-2) + (-2) + 3 + 2 = 7
你预期的6是前3个正元素的和,确实是不含负数的子数组最大值,但不符合常规连续子数组的定义——连续子数组允许包含负数,只要整体总和更大即可。
实现逻辑校验
你写的是标准Kadane算法实现,逻辑完全符合算法要求:
max_ending_here记录以当前元素结尾的连续子数组的最大和- 每次迭代先累加当前元素,再更新全局最大值
max_so_far - 若
max_ending_here小于0则重置为0,代表放弃当前负收益的前缀,从下一个元素重新开始累计
这个版本仅有一种边界特性:当输入数组全为负数时,会返回数组中最大的单个负数,符合「子数组至少包含1个元素」的通用要求,逻辑无错。
如果你确实需要不含负数的子数组最大和
如果你的业务要求子数组不能包含负元素,只需要在原有逻辑上加一个判断,遇到负数就重置max_ending_here即可:
static int maxSumSubArrayNoNegative(int [] a){ int size = a.length; int max_so_far = 0, max_ending_here = 0; for (int i = 0; i < size; i++) { if (a[i] < 0) { max_ending_here = 0; continue; } max_ending_here = max_ending_here + a[i]; if (max_so_far < max_ending_here) max_so_far = max_ending_here; } return max_so_far; }
该版本运行你的测试数组会返回你预期的6。
内容的提问来源于stack exchange,提问作者Khan Mohammed ahmed
相关产品推荐
相关产品推荐

