Solution 1:比较原始的backtrack
class Solution {
public List<List<Integer>> combine(int n, int k) {
int[] num=new int[n+2];
for(int i=1;i<=n;i++){
num[i]=i;
}
List<List<Integer>> res=new ArrayList<>();
backtrack(1,res,k,num,n,1);
return res;
}
public void backtrack(int t,List<List<Integer>> res,int k,int[] num,int n,int start){
if(t>k){
int flag=1;
List<Integer> list=new ArrayList<Integer>();
for(int m=1;m<=k;m++){
list.add(num[m]);
}
res.add(list);
return;
}
for(int i=start;i<=n;i++){
swap(num,i,t);
backtrack(t+1,res,k,num,n,i+1);
swap(num,i,t);
}
}
public void swap(int[] num, int a ,int b){
if(a==b)return;
num[a]^=num[b];
num[b]^=num[a];
num[a]^=num[b];
}
}
Solution 2:利用list的函数直接backtrack
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res=new ArrayList<>();
List<Integer> list = new ArrayList<>();
backtrack(1,res,list,k,n,1);
return res;
}
public void backtrack(int t,List<List<Integer>> res,List<Integer> list,int k,int n,int start){
if(t>k){
res.add(new ArrayList(list));
return;
}
for(int i=start;i<=n;i++){
list.add(i);
backtrack(t+1,res,list,k,n,i+1);
list.remove(list.size()-1);
}
}
}