我一直在努力解决这个利特码问题Combination Sum

给定一组不同的候选整数和一个目标整数,>将返回一个列表,其中>所选数字与目标的和为候选的所有唯一组合.您可以按任何顺序退回组合.

同样的数字可以从候选人中 Select ,次数不限.如果所选数字中至少有一个的频率不同,则两个组合是唯一的.

我想出了这个解决方案:

class Solution {
    public void recUtil(List<List<Integer>> result, int[] candidates, List<Integer> list, int sum, int target, int ind) {
        if(sum>target || ind>=candidates.length) return;
        if(sum==target) {
            result.add(new ArrayList<>(list));
            return;
        }

        recUtil(result, candidates, list, sum, target, ind+1);
        list.add(candidates[ind]);
        recUtil(result, candidates, list, sum+candidates[ind], target, ind);
        list.remove(list.size()-1);
    }

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        
        recUtil(result, candidates, new ArrayList<>(), 0, target, 0);

        return result;        
    }
}

如果我将第5行result.add(new ArrayList<>(list));替换为result.add(list);,则此解决方案不起作用

对于输入:

[2,3,6,7]

和目标7,我在结果ArrayList中得到两个空的ArrayList

[[],[]]

而不是

[[2,2,3],[7]]

我知道这一定是件蠢事,所以我不敢在这里问. 我是Java新手,有谁能解释一下为什么只是将列表添加到结果中不起作用.

推荐答案

如果我将第5行result.add(new ArrayList<>(list));替换为result.add(list);,则此解决方案不起作用

对,是这样.您似乎已经理解,后者添加的是工作列表本身,而不是它的副本,所以您还应该理解,在这种情况下,随后调用list.add()list.remove()会影响您添加到结果中的相同列表,无论您添加了多少次.这不是你想要的.为了能够返回多个解决方案,您需要多个列表,就像您的原始代码提供的那样.

Java相关问答推荐

长音符

将具有多个未知字段的SON映射到Java POJO

查找最大子数组的和

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

@从类文件中删除JsonProperty—Java

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

有没有办法让扩展变得多态?

如何获取Instant#of EpochSecond(?)的最大值

将java.util.Date转换为OffsetDateTime

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

声明带有泛型的函数以用作查找映射中的值

如何在JavaFX中处理多个按钮

如何在Cosmos DB(Java SDK)中增加默认响应大小

如果按钮符合某些期望,如何修改它的文本?

使用Jackson库反序列化json

如何使用Criteria Builder处理一对多关系中的空值?

有谁能帮我修一下这个吗?使输出变得更加整洁

在应用程序运行时更改LookAndFeel

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?