You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解数组所有子数组元素和存入ArrayList的实现问题求助

现有代码问题分析
  • 核心逻辑覆盖不全:仅统计了全数组总和、单个元素值、逐步移除最左元素的后缀和三类值,完全遗漏了数组中间位置起止的子数组和,例如数组[1,2,3]中的子数组[1,2]、[2,3]的和无法被统计到。
  • 额外冗余/错误逻辑:
    1. 你添加了sum-arr[i]>0的判断,会直接过滤掉所有和为负数的子数组,不符合收集所有子数组和的需求。
    2. 用list.contains()做去重操作,如果你没有明确的去重要求,这步逻辑会导致重复出现的子数组和被遗漏。
正确实现思路

如果需求是收集数组所有连续子数组的元素和,直接通过双重循环枚举即可:

  1. 外层循环枚举子数组的左端点
  2. 内层循环从左端点开始逐步向右扩展,每次累加当前右端点元素值,将累加结果存入列表

补充:如果你学习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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:18:02