46-全排列
思路:回溯 + 递归
回溯算法 是深度优先的。
ts
function permute(nums: number[]): number[][] {
const res: number[][] = []
backtrack([]) // 从空路径开始
return res
// 回溯
function backtrack(path: number[]) {
if (path.length === nums.length) res.push(path)
// 递归
nums.forEach((n) => {
if (path.includes(n)) return
backtrack(path.concat(n))
})
}
}function permute(nums: number[]): number[][] {
const res: number[][] = []
backtrack([]) // 从空路径开始
return res
// 回溯
function backtrack(path: number[]) {
if (path.length === nums.length) res.push(path)
// 递归
nums.forEach((n) => {
if (path.includes(n)) return
backtrack(path.concat(n))
})
}
}ts
function permute(nums: number[]): number[][] {
const result: number[][] = []
backtrack(result, [], nums)
return result
// 回溯 + 递归
function backtrack(result: number[][], temp: number[], nums: number[]) {
// 终止条件
if (temp.length === nums.length) {
return result.push([...temp])
}
for (let i = 0; i < nums.length; i++) {
// 找到一个不在 temp 中的数字
if (temp.includes(nums[i])) continue
temp.push(nums[i])
// 递归 ( 继续找符合要求的数字 )
backtrack(result, temp, nums)
// 回溯 ( 将已经操作完的数字弹出 )
temp.pop()
}
}
}function permute(nums: number[]): number[][] {
const result: number[][] = []
backtrack(result, [], nums)
return result
// 回溯 + 递归
function backtrack(result: number[][], temp: number[], nums: number[]) {
// 终止条件
if (temp.length === nums.length) {
return result.push([...temp])
}
for (let i = 0; i < nums.length; i++) {
// 找到一个不在 temp 中的数字
if (temp.includes(nums[i])) continue
temp.push(nums[i])
// 递归 ( 继续找符合要求的数字 )
backtrack(result, temp, nums)
// 回溯 ( 将已经操作完的数字弹出 )
temp.pop()
}
}
}总结:
- 不断深入寻找满足条件地值 ( 深度优先 )
- 要获取所有可能结果 ( 全排列 ),所以需要一个容器去装各种结果 ( result )
Ayingotts's notes