图取自代码随想录:
思路:按照组合的含义,对数据进行拆分,分组成指定的个数,按照图片的思路,递归处理
class Solution {
List<List<Integer>> list = new ArrayList<>(); //整合结果
List<Integer> path = new ArrayList<>();//某一次遍历的结果
public List<List<Integer>> combine(int n, int k) {
func(n, k, 1);
return list;
}
public void func(int n, int k, int startIndex) {
if (path.size() == k) { //当大小和k相等时,收割一个结果,并结束该回合的递归
list.add(new ArrayList<>(path)); //每次add一个全新的,需要new一个
return;
}
for (int i = startIndex; i <= n; i++) {
path.add(i);
func(n, k, i+1); //递归剩余的下一个区块数据
path.remove(path.size()-1); //把最后一个值去掉,作为回溯的基础数据
}
}
}