Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
Example:
Input: n = 4, k = 2
Output:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
回溯法 backtrack 一直是我不明白的部分
今天想专门加强一下
思路在本上写出来了 很难说但我标明了每一步都在干嘛
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<Integer>();
dfs(res,temp,n,k,1);
return res;
}
public void dfs(List<List<Integer>> res, List<Integer> temp, int n, int k, int m){
if(k==0){//终止条件,如果list有两位则停止
res.add(new ArrayList<Integer>(temp));
return ;
}
for(int i = m;i<=n;i++){ //list的第一位
temp.add(i);
dfs(res,temp,n,k-1,i+1);//list的第二位
temp.remove(temp.size()-1);//去除已保存的第二位,构成新的数组
}
}
}