public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> out = new ArrayList<>();
levelCombine(res, out, n, k, 1);
return res;
}
/**
* 建立一个保存最终结果的大集合res,定义一个保存每一个组合的小集合out,
* 每次放一个数到out里,如果out里数个数到了k个,则把out保存到最终结果中,否则在下一层中继续调用递归。
* @param res
* @param n
* @param k out 集合的 size
* @param start 当前元素
*/
public void levelCombine(List<List<Integer>> res,List<Integer> out, int n, int k,int start) {
if (out.size() == k) {
res.add(new ArrayList<>(out));
return;
}
for (int i = start; i <= n; i++) {
out.add(i);
levelCombine(res, out, n, k, i + 1);
out.remove(out.size() - 1);
}
}
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length!=0) {
List<Integer> out = new ArrayList<>();
levelPermute(res, out, nums);
}
return res;
}
public void levelPermute(List<List<Integer>> res,List<Integer> out, int[] nums) {
if (out.size() == nums.length) {
res.add(new ArrayList<>(out));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!out.contains(nums[i])) {
out.add(nums[i]);
levelPermute(res, out, nums);
out.remove(out.size() - 1);
}
}
}