[leetcode] Combinations

 

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
https://oj.leetcode.com/problems/combinations/

思路:递归,依次按要求填入结果。

public class Solution {

    public ArrayList<ArrayList<Integer>> combine(int n, int k) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        combineHelper(res, tmp, 1, n, k);
        return res;

    }

    private void combineHelper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> tmp, int start, int n, int k) {
        if (k == 0) {
            res.add(new ArrayList<Integer>(tmp));
            return;
        }

        for (int i = start; i <= n - k + 1; i++) {
            tmp.add(i);
            combineHelper(res, tmp, i + 1, n, k - 1);
            tmp.remove(tmp.size() - 1);
        }

    }

    public static void main(String[] args) {
        System.out.println(new Solution().combine(4, 2));
    }

}
View Code

 

第二遍记录:

注意递归终止条件k==0(k表示还需要填入的个数),和 for循环填入变量i的终止点:n-k+1,注意k是不断变化的。 

注意结果List<List<Integer>>,res应定义为List<List<Integer>> res = new ArrayList<List<Integer>>();

注意dfs递推参数的变化  dfs(res, tmp, n, k - 1, i + 1); k减1,start=i+1;

 

 第四遍记录:

画出递归调用树分析。

注意的还是第二遍的那些条件。

 

posted @ 2014-06-29 17:06  jdflyfly  阅读(146)  评论(0编辑  收藏  举报