如何计算数组严格递增序列的最大和?C语言代码调试求助
修复严格递增子序列最大和计算的代码错误
原代码的核心错误
- 第二个循环中每次将
max重置为arr[0],完全破坏了递增序列的跟踪逻辑,无法正确判断当前元素是否属于当前递增子序列。 - 判断逻辑混乱:
if(max<arr[i])更新max后,后续的if(max>arr[i])永远不会成立(因为max已经等于arr[i]),导致循环不会提前终止,最终会累加所有元素的和,和需求完全不符。 - 没有考虑数组中存在多个不连续递增子序列的情况(比如测试用例中的
4、5是另一个递增子序列),无法比较不同子序列的和来找到最大值。
修正后的代码
我们采用线性遍历维护当前序列的方法,逻辑直观且高效:
#include <stdio.h> int main(){ int size; printf("Enter the size: "); scanf("%d", &size); int arr[size]; for(int i = 0; i < size; i++){ printf("Enter element #%d: ", i+1); scanf("%d", &arr[i]); } if(size == 0){ printf("Largest sum = 0"); return 0; } int current_sum = arr[0]; int max_sum = arr[0]; for(int i = 1; i < size; i++){ // 当前元素大于前一个,加入当前递增序列的和 if(arr[i] > arr[i-1]){ current_sum += arr[i]; } else { // 不满足递增,重置当前序列和为当前元素,开启新序列 current_sum = arr[i]; } // 更新全局最大和 if(current_sum > max_sum){ max_sum = current_sum; } } printf("Largest sum = %d", max_sum); return 0; }
代码逻辑说明
- 初始化
current_sum(当前递增子序列的和)和max_sum(全局最大和)为数组第一个元素。 - 从第二个元素开始遍历:
- 若当前元素大于前一个,说明属于当前递增序列,将其加入
current_sum。 - 若不满足严格递增,说明当前序列结束,重置
current_sum为当前元素,开始新的递增序列。
- 若当前元素大于前一个,说明属于当前递增序列,将其加入
- 每次遍历后,比较
current_sum和max_sum,更新全局最大和。 - 加入了数组为空的边界处理,提升代码鲁棒性。
测试验证:
- 输入
2 4 5 1 7 3时,current_sum依次为2→6→11→1→8→3,max_sum最终为11,符合预期。 - 输入
2 3 10 4 5时,current_sum依次为2→5→15→4→9,max_sum最终为15,匹配正确结果。
内容的提问来源于stack exchange,提问作者tiredcomscistudent
相关产品推荐
相关产品推荐

