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], ]Solution 1 Backtracking recursive
public static List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
helper(res, new ArrayList<Integer>(), n, 1, k);
return res;
}
public static void helper(List<List<Integer>> res, List<Integer> list, int n, int index, int k) {
if (k == 0) {
res.add(list);
return;
}
for (int i = index; i <= n; i++) {
List<Integer> temp = new ArrayList<Integer>(list);
temp.add(i);
helper(res, temp, n, i + 1, k - 1);
}
}
Solution 2 Iterative
//Iterative
public static List<List<Integer>> combine2(int n, int k) {
if (n == 0 || k == 0 || k > n) return Collections.emptyList();
List<List<Integer>> res = new ArrayList<List<Integer>>();
for (int i = 1; i <= n + 1 - k; i++) res.add(Arrays.asList(i));
for (int i = 2; i <= k; i++) {
List<List<Integer>> tmp = new ArrayList<List<Integer>>();
for (List<Integer> list : res) {
for (int m = list.get(list.size() - 1) + 1; m <= n - (k - i); m++) {
List<Integer> newList = new ArrayList<Integer>(list);
newList.add(m);
tmp.add(newList);
}
}
res = tmp;
}
return res;
}