题目:Combinations
难度:medium
问题描述:
Given two integers n and k, return all possible combinations ofk numbers out of 1 ... n.
For example,
If n = 4 and k = 2, a solution is:
[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
解题思路:使用DFS,回溯求解。注意添加判断:剩余字符数小于剩余步数时,不在搜索。可以极大减少迭代次数。
具体代码如下:
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> reslist=new ArrayList<List<Integer>>();
diedai(new ArrayList<Integer>(),0,k,1,n,reslist);
return reslist;
}
//可用字符从start到end
//已经进行step步,一共需要k步
public void diedai(ArrayList<Integer> list,int step,int k,int start,int end,List<List<Integer>> reslist){
if((k-step)>(end-start+1)){
return;
}
if(step==k){
List<Integer> temp = new ArrayList<>(list);
reslist.add(temp);
return;
}
for(int i=start;i<=end;i++){
list.add(i);
diedai(list,step+1,k,i+1,end,reslist);
list.remove(list.size()-1);
}
}