力扣(LeetCode) 链接:https://leetcode.cn/problems/combinations/discussion/
思路
- 递归函数的返回值以及参数
- 回溯函数终止条件
- 单层搜索的过程
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
解题
/**
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
var combine = function (n, k) {
const res = []
const path = []
function bfs(start) {
if (path.length === k) {
res.push([...path])
return
}
for (var i = start; i <= n - (k - path.length) + 1; i++) {
path.push(i) // 处理节点
bfs(i + 1) // 递归处理
path.pop() // 回溯,撤销处理的节点
}
}
bfs(1)
return res
}