1.组合问题
这道题的搜索路径如下
整体思路:图中可以看出,叶子节点就是解。深度优先搜索要使用栈来保存节点的信息,用一个列表来存储每一个叶子节点。详细过程看下面代码。
var combine = function(n, k) {
// 使用深度优先的搜索方案,加上剪枝的处理
let Stack = [] // 栈中保存访问的节点信息
let res = [] // 保存结果
function DFS(n,k,startIndex){
if(Stack.length === k){
//栈中的路径够k个那么就已经是其中一个解了
res.push([...Stack])
return
}
// 否者就正常遍历就可以
for(let i = startIndex; i <= n; i++){
Stack.push(i)
DFS(n,k,i + 1)
Stack.pop()
}
}
DFS(n,k,1)
return res
};
2.排列问题
和上一题思路基本差不多,简单画一下搜索树就可以
var permute = function(nums) {
// 同样是DFS + 剪枝
let res = [] // 计算结果
let Stack = [] // DFS的路径
let len = nums.length
// 传入数组和每次选取的数字
function DFS(arr){
if(Stack.length === len){
res.push([...Stack])
return
}
let temp = [...arr] // 复制一个出来不修改原来的数组
for(let i = 0; i < temp.length; i++){
Stack.push(temp[i])
DFS(temp.filter((item,index)=>(index !== i)))
Stack.pop()
}
}
DFS(nums)
return res
};