77. 组合(回溯)

本文介绍了一个名为Solution的Java类,它使用递归的backtrack方法解决数字组合问题。方法`combine`接收整数n和k,通过回溯遍历生成所有可能的长度为k的数字列表。关键点在于处理if-else结构,确保每次添加到ans的是list的副本而非引用,避免修改影响其他组合。
摘要由CSDN通过智能技术生成

和上一道回溯的题思路大致相同:
从前往后依次遍历,之后拼接的数字为当前数字cur的之后的数字,直到list的长度等于k,将list加入到ans当中。

class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
        backtrack(n, k, 1, ans, new ArrayList<>());
        return ans;
    }
    public void backtrack(int n, int k, int cur, List<List<Integer>> ans, List<Integer> list) {
        if (list.size() == k) ans.add(new ArrayList<>(list));
        else {
            for (int i = cur; i <= n; ++i) {
                list.add(i);
                backtrack(n, k, i + 1, ans, list);
                list.remove(list.size() - 1);
            }
        }
    }
}

特别注意:

  1. ifelse的区分,否则if要及时return
  2. 回溯的时候新的cur值应该是i+1而不是cur+1
  3. ans.add(new ArrayList<>(list)); 在Java中,对象赋值是传递引用的。这意味着当你将一个对象赋给另一个变量时,它们实陘指向同一个对象。所以,如果你简单地将list添加到ans中,实际上你只是将对list的引用添加到了ans中,而不是list的副本。这就意味着当你后续修改list时,ans中对应的组合也会被修改,因为它们共享相同的引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值