leetcode——77.组合

递归+回溯

完成!

public List<List<Integer>> combine(int n, int k) {
        if(k>n){
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        if(k==n){
            for(int i = 1;i<=n;i++){
                list.add(i);
            }
            res.add(list);
            return res;
        }
        //接下来是k<n的情况
        //当数组元素个数==k的时候,将其添加进res
        //需要一个递归函数
        //得有一个标记是否被访问过的参数
        boolean[] selected = new boolean[n+1];
        backtrack(n,k,res,list,selected);
        return res;
    }

    private void backtrack(int n, int k, List<List<Integer>> res, List<Integer> list,boolean[] selected) {
        if(list.size() == k){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i = 1;i<=n;i++){
            if(!selected[i] && (list.isEmpty() || i>list.get(list.size()-1))){
                list.add(i);
                selected[i] = true;
                backtrack(n, k, res, list, selected);
                selected[i] = false;
                list.remove(list.size() - 1);
            }
        }
    }

 优化之后:

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

 ——2020.8.2

我的前方是万里征途,星辰大海!!
原文地址:https://www.cnblogs.com/taoyuxin/p/13418795.html