给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路:
相当于是树的遍历问题
List<Integer> path = new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> combine(int n, int k) {
if(n<k) return result;
backTracking(n,k,1);
return result;
}
public void backTracking(int n,int k,int startIndex){
//保证从startIndex后取数的个数够k-path.size()个
if(n-startIndex+1+path.size()<k){
return;
}
if(path.size()==k){
//注意:因为path是全局变量,所以在保存时必须重新创建List<Integer>集合,不能直接将path传入。
result.add(new ArrayList<Integer>(path));
return;
}
for(int i=startIndex;i<=n;i++){
path.add(i);
backTracking(n,k,i+1);//控制树的纵向遍历
path.remove(path.size()-1);//回溯
}
}