给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
class Solution{
public List<List<Integer>> combine(int n,int k){
List<List<Integer>> res=new ArrayList<>(); //返回的所有结果的数组
int[] nums=new int[n]; //按题目意思生成范围1~n组成的数组int[n]
for(int i=1;i<n+1;i++){
nums[i-1]=i;
}
//参数分别为:返回的结果数组,开始数字的下标,生成的数组,k是多少,临时数组
backtrack(res,0,nums,k,new ArrayList<>());
return res;
}
private void backtrack(List<List<Integer>> res,int begin,int[] nums,int k,List<Integer> tmp){
if(tmp.size()==k){ //满足k位数字
res.add(new ArrayList<>(tmp));
return ; //跳出回溯
}
for(int i=begin;i<nums.length;i++){ //起点,然后向后遍历
tmp.add(nums[i]); //添加元素
backtrack(res,i+1,nums,k,tmp); //继续遍历
//上面的if就是跳出遍历,回溯
tmp.remove(tmp.size()-1);
}
}
}