[leetcode] 77. 组合

77. 组合

递归回溯枚举搜就好

dfs状态(int n, int k, int last, List cur, List<List> ans)

n表示从[1~n]中取数,k表示当前状态下还需要取几个数,last表示上一个数取的是几,cur表示当前已经取的数。ans为总的答案list,最后要返回到main的集合。

如何枚举?比如说当n=10,k=4时
那么枚举如下,共4层循环:

  1. 从1到n-3选取一个数记作k1
  2. 从k1+1到n-2选取一个数记作k2
  3. 从k3+1到n-1选取一个数记作k3
  4. 从k3+1到n选取一个数记作k4.此时一个满足条件的答案就是
class Solution {

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();

        List<Integer> cur = new ArrayList<>();

        dfs(n, k, 0, cur, ans);
        return ans;
    }

    private void dfs(int n, int k, int last, List<Integer> cur, List<List<Integer>> ans) {
        if (k == 0) {
            ans.add(new ArrayList<>(cur));
            return;
        }
        for (Integer i = last + 1; i <= n; i++) {
            cur.add(i);
            dfs(n, k - 1, i, cur, ans);
            cur.remove(i);
        }
    }
}
posted @ 2018-07-30 13:25  ACBingo  阅读(514)  评论(0编辑  收藏  举报