求解数组所有子数组元素和存入ArrayList的实现问题求助
现有代码问题分析
- 核心逻辑覆盖不全:仅统计了全数组总和、单个元素值、逐步移除最左元素的后缀和三类值,完全遗漏了数组中间位置起止的子数组和,例如数组
[1,2,3]中的子数组[1,2]、[2,3]的和无法被统计到。 - 额外冗余/错误逻辑:
- 你添加了
sum-arr[i]>0的判断,会直接过滤掉所有和为负数的子数组,不符合收集所有子数组和的需求。 - 用
list.contains()做去重操作,如果你没有明确的去重要求,这步逻辑会导致重复出现的子数组和被遗漏。
- 你添加了
正确实现思路
如果需求是收集数组所有连续子数组的元素和,直接通过双重循环枚举即可:
- 外层循环枚举子数组的左端点
- 内层循环从左端点开始逐步向右扩展,每次累加当前右端点元素值,将累加结果存入列表
补充:如果你学习Kadane算法的目的是求最大子数组和,不需要生成所有子数组和,Kadane算法可以在O(n)时间复杂度、O(1)空间复杂度下直接计算得到结果,不需要额外存储所有子数组和。
正确参考代码
import java.util.*; class Sample { public static void main (String[] args) throws java.lang.Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i]=sc.nextInt(); } ArrayList<Integer> list = new ArrayList<>(); // 枚举左端点 for(int left=0;left<n;left++){ int currentSum = 0; // 扩展右端点 for(int right=left;right<n;right++){ currentSum += arr[right]; list.add(currentSum); } } System.out.println(list); // 如果需要去重可以放开下面注释的代码 // List<Integer> distinctList = new ArrayList<>(new HashSet<>(list)); } }
内容的提问来源于stack exchange,提问作者Ranitdas26
相关产品推荐
相关产品推荐

