为什么C++最大子数组和代码得到的最大和为最后一个子数组的和
问题原因
你的代码存在两处核心逻辑错误,直接导致输出不符合预期:
- 最大值变量被频繁重置:你把
largestsum = INT_MIN写在了内层j循环的内部,每遍历一个以i为起点、j为终点的子数组,就会把之前记录的最大值清空为INT_MIN,之前所有子数组的最大值记录直接丢失。 - 最大值比较逻辑位置错误:你把
largestsum = max(largestsum, currentsum)写在了j循环结束之后,整个j循环运行过程中没有做任何最大值比对,只有当所有以i为起点的子数组都遍历完之后,才会用最后一个子数组的currentsum和被重置过的largestsum比较,最终输出的自然就是最后一个子数组的和。你给出的测试用例中,i=0时最后一个子数组[-5,5,6,-7,1]的和刚好是0,所以输出结果为0。
另外额外说明:C++标准不支持可变长度数组int ar[n],这属于部分编译器的扩展特性,如需跨编译器兼容建议替换为vector或者动态申请数组。
修正后代码
#include <bits/stdc++.h> using namespace std; void printpair(int ar[], int n) { for (int i = 0; i < n; i++) { // 每个i作为起点的子数组最大值单独初始化 int largestsum = INT_MIN, currentsum = 0; for (int j = i; j < n; j++) { currentsum = 0; for (int k = i; k <= j; k++) { cout << ar[k] << ","; currentsum += ar[k]; } // 每生成一个子数组就同步更新最大值 largestsum = max(largestsum, currentsum); cout << "\n"; } cout << "the largest sum is " << largestsum << endl; } } int main() { int n; cin >> n; int *ar = new int[n]; for (int i = 0; i < n; i++) cin >> ar[i]; printpair(ar, n); delete[] ar; return 0; }
修正后针对你给出的测试用例,外层第一次循环输出的最大和为6,符合预期结果。
内容的提问来源于stack exchange,提问作者convoluxon
相关产品推荐
相关产品推荐

