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], ]
枚举的题一般都是DFS+Backtracking
经常错的:要新建一个object,保存得到的结果!!!比如这个list,因为你是要restore的,不新建的话又把之前得到的值删掉了。。。
public class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
List<Integer> list = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
helper(list, set, n, k, 0);
return res;
}
public void helper(List<Integer> list, HashSet<Integer> set, int n, int k, int pre) {
if (list.size() == k) {
List<Integer> t = new ArrayList<>(list); //注意要赋值到一个新的list上!!!
res.add(t);
return;
}
for (int i = pre + 1; i <= n; i++) { //用pre保存之前的值,新产生的总要比pre大
if (set.contains(i)) continue;
list.add(i);
set.add(i);
helper(list, set, n, k, i);
list.remove((Integer)i);
set.remove(i);
}
}
}