地址:https://leetcode-cn.com/problems/permutations/
题目描述:
给定一个 没有重复 数字的序列,返回其所有可能的全排列,数组中不包含重复元素。
示例:
输入: [1,2,3] 输出: [ [1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题解思路
初始时,循环数组中的每一个值,并进行递归,递归的目的也是循环数组中每一个值,不过递归中每次循环,都要把已经循环到的值排除在外,只添加未循环到的值,并把这些值存入到子数组集合中,当子数组集合的长度与原来数组长度相同,那这就跑出来一个排列了,把这个子数组集合放在总的数组集合中。
此时退出递归后,把已记录的值从子数组集合踢出,以便下次使用。
题解代码
递归方式:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let child = []; // 每次组合的结果集
let result = []; // 总的结果集
//定义递归函数
const loop = (nums) => {
// 如果此次的结果集,和总的长度相同,代表是满了,就添加到总的结果集中
if(nums.length === child.length) {
result.push([...child])
return
}
// 挨个循环每个字符
for(let i = 0; i < nums.length;i++) {
// 子结果集中有了,则直接跳过
if(child.includes(nums[i])) continue
// 将该次的值,放入结果集中
child.push(nums[i])
// 继续调用
loop(nums)
// 用完了,出结果集
child.pop()
}
}
loop(nums)
return result
};