每天学习一点算法 2026/03/18
题目:全排列
给定一个不含重复数字的数组
nums,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
这道题跟之前的电话号码的字母组合很像,可以看成 n 叉树,只是下一层子节点选择范围是上一层选择后剩余的数字。
typescript
function permute(nums: number[]): number[][] {
const resArr = []
const len = nums.length
function helper (nextNums: number[], res: number[]) {
if (res.length === len) {
// 重排数组等于长度等于原数组长度,这条路径的递归重排完成
resArr.push(res)
return
}
for (let i = 0; i < nextNums.length; i++) {
// 循环选择当前节点
const cuurent = [...res] // 不修改每一层的重排结果
cuurent.push(nextNums[i]) // 选择节点
// 获取剩余数组,不修改这一层的剩余数组(toSpliced可以直接实现去掉某些元素,但是力扣这个运行环境不支持)
const next = nextNums.filter(item => item !== nextNums[i])
// 递归到下一层
helper(next, cuurent)
}
}
// 初始传入原数组和重排数组容器
helper(nums, [])
return resArr
}
题目来源:力扣(LeetCode)