let 77 Combinations

本文深入探讨了使用Java实现从1到n中选取k个不同数字的所有可能组合的方法。重点介绍了递归深度优先搜索(DFS)算法,并强调了在Java中处理集合时避免因引用传递而产生的副作用的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主题思想: : 有序数组,组合, 1…. n 可以抽象为一个有序数组, 题目大意就是从n个元素挑出k个的所有组合。

AC 代码: 代码中需要注意的一点就是,java是依靠引用的,在ans.add()时,必须新建list 对象,否则在执行完 dfs 会执行,tmp.remove() 这时,会清楚已经加入到ans的list ,导致ans 结果变成[[],[],[],[],...] 就是因为

for(int i=now+1;i<=n-k+step+1;i++){

            tmp.add(i);
            dfs(tmp,ans,i,step+1,k,n);
            tmp.remove(tmp.size()-1);  // here
        }
        中 tmp执行了remove() 方法,修改了ans中元素

所以必须用   ans.add(new ArrayList<Integer>(tmp));而不是  ans.add(tmp);

重点知识点是,java函数参数不存在像c++那样,可以直接改变,返回,就是说函数参数无法返回,,但是却可以改变对象里面的值
class Solution {
    public List<List<Integer>> combine(int n, int k) {


        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        if(n<k) return ans;

        dfs(new ArrayList<Integer> (),ans,0,0,k,n);
        return ans;
    }

    public void dfs(List<Integer> tmp,List<List<Integer>> ans,int now ,int step, int k,int n){

         if(step==k){
             // notice  this can not use ans.add(tmp) ;
             // this must create a new array list , otherwise, after dfs, tmp will remove the obj,that added to ans ,so ans will be null like this[[],[],]
             ans.add(new ArrayList<Integer>(tmp));
             return ;
         }

        for(int i=now+1;i<=n-k+step+1;i++){

            tmp.add(i);
            dfs(tmp,ans,i,step+1,k,n);
            tmp.remove(tmp.size()-1);  // here
        }
        return ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值