地址: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]

]

题解思路

初始时,循环数组中的每一个值,并进行递归,递归的目的也是循环数组中每一个值,不过递归中每次循环,都要把已经循环到的值排除在外,只添加未循环到的值,并把这些值存入到子数组集合中,当子数组集合的长度与原来数组长度相同,那这就跑出来一个排列了,把这个子数组集合放在总的数组集合中。

此时退出递归后,把已记录的值从子数组集合踢出,以便下次使用。

题解代码

递归方式:

  1. /**
  2. * @param {number[]} nums
  3. * @return {number[][]}
  4. */
  5. var permute = function(nums) {
  6. let child = []; // 每次组合的结果集
  7. let result = []; // 总的结果集
  8. //定义递归函数
  9. const loop = (nums) => {
  10. // 如果此次的结果集,和总的长度相同,代表是满了,就添加到总的结果集中
  11. if(nums.length === child.length) {
  12. result.push([...child])
  13. return
  14. }
  15. // 挨个循环每个字符
  16. for(let i = 0; i < nums.length;i++) {
  17. // 子结果集中有了,则直接跳过
  18. if(child.includes(nums[i])) continue
  19. // 将该次的值,放入结果集中
  20. child.push(nums[i])
  21. // 继续调用
  22. loop(nums)
  23. // 用完了,出结果集
  24. child.pop()
  25. }
  26. }
  27. loop(nums)
  28. return result
  29. };