1、题目
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、思路:
既可以使用动态规划,也可以用DFS。第一次就使用比较熟悉的DFS来做,利用回溯;由于所求为组合不是排列,故设标记变量start,记录当前 所选值的下一个值(即下一次递归在[start,n]来选择),利用数组来记录已经选取的组合。当长度满足k后,将组合添加进list,结束此轮递归。
还有优化空间,我还是太菜了
class Solution {
private static int[] record;
private List<List<Integer>> list;
private List<Integer> tem;
public List<List<Integer>> combine(int n, int k) {
record = new int[n+1];
list = new ArrayList<List<Integer>>();
tem = new ArrayList<Integer>();
dfs(1,0,n,k);
return list;
}
public void dfs(int start, int len,int n,int k) {
if(len == k) {
for (int i = 0; i < len; i++) {
tem.add(record[i]);
}
list.add(tem);
tem = new ArrayList<Integer>();
return;
}
for (int i = start; i <= n; i++) {
record[len] = i;
dfs(i+1,len+1,n,k);
}
}
}