给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
方法:递归,回溯
思路:从n个数里面取k个数的组合,先锁定第一个数,然后从剩下数中锁定第二个,依次类推直到拿到k个数,然后开始回溯,改变第K个数,拿到第k个数的所有可能,然后依次回溯,直到拿到所有组合。
1,从index=1处开始依次锁定数,每锁定一个数,则将k-1,并将index+1;然后从index+1处锁定第二个数,直到拿到所有K个数;
2,index的最大值为n-k+1处,保证剩下的数字中满足还有k-1个数;
3,每次回溯时,则需要将当前list中最后一个元素移除,以便于拿到这个位置其他可能的值;
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
if (n < 1 || n < k)
return res;
com(n,k,1,new ArrayList<>());
return res;
}
//递归
private void com(int n, int k, int index, List<Integer> temp) {
//递归结束条件k==0,将这个组合存到结果集中
if (k == 0) {
res.add(new ArrayList<>(temp));
return;
}
//递归内容,从1开始拿所有可能的值,例如4,2中,i最大为3,所以最大i=n-k+1;
for (int i = index; i <= n-k+1; i ++) {
//先存入i,然后再根据K的值取具体后续的值
temp.add(i);
com(n, k-1, i+1, temp);
temp.remove(temp.size() - 1);//回溯,删除
}
}
}