为何内层循环内外的计数与求和初始化位置会影响负子数组统计结果?
负子数组统计的循环逻辑问题分析
一、count自增位置的差异
你要统计的是整个子数组的和小于0的数量,但错误写法把count++放在最内层循环里,会导致:
- 内层循环是遍历子数组
[i,j]的每个元素,每次累加后判断sum<0就计数,这会把同一个子数组的中间累加过程当成独立的统计项。比如子数组[-1, 2],累加第一个元素时sum=-1<0,count会加1;但这个子数组的整体和是1,根本不该被统计,错误写法就多算了一次。 - 正确的做法是等内层循环跑完,得到子数组
[i,j]的完整和后,再判断sum<0才count++,这样统计的才是符合要求的完整子数组数量。
二、sum初始化位置的差异
sum的作用是计算当前子数组[i,j]的和,初始化位置错误会导致累加混乱:
- 错误写法把
sum初始化放在循环末尾,sum会保留之前所有子数组的累加结果。比如算完[i,j]的和后,sum没重置,再算[i,j+1]时,sum会在之前的结果上继续加arr[j+1],而不是从arr[i]重新开始计算,得到的完全不是目标子数组的和。 - 正确的做法是在第二个循环(固定结束位置
j)开始时,把sum初始化为0,这样每次计算子数组[i,j]的和时,都是从0开始累加arr[i]到arr[j]的元素,结果才准确。
你提供的错误代码:
for (int i = 0; i < arr.length; i++) { for (int j = i; j < arr.length; j++) { for (int k = i; k <= j; k++) { System.out.println(sum+=arr[k]); if (sum < 0) { count++; } } } } System.out.println(count);
内容的提问来源于stack exchange,提问作者Kowshika
相关产品推荐
相关产品推荐

