题目描述:给定一个没有重复数字的序列,返回其所有可能的全排列。

    示例:
    输入: [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. // 入参是一个数组
    6. const permute = function(nums) {
    7. // 缓存数组的长度
    8. const len = nums.length
    9. // curr 变量用来记录当前的排列内容
    10. const curr = []
    11. // res 用来记录所有的排列顺序
    12. const res = []
    13. // visited 用来避免重复使用同一个数字
    14. const visited = {}
    15. // 定义 dfs 函数,入参是坑位的索引(从 0 计数)
    16. function dfs(nth) {
    17. // 若遍历到了不存在的坑位(第 len+1 个),则触碰递归边界返回
    18. if(nth === len) {
    19. // 此时前 len 个坑位已经填满,将对应的排列记录下来
    20. res.push(curr.slice())
    21. return
    22. }
    23. // 检查手里剩下的数字有哪些
    24. for(let i=0;i<len;i++) {
    25. // 若 nums[i] 之前没被其它坑位用过,则可以理解为“这个数字剩下了”
    26. if(!visited[nums[i]]) {
    27. // 给 nums[i] 打个“已用过”的标
    28. visited[nums[i]] = 1
    29. // 将nums[i]推入当前排列
    30. curr.push(nums[i])
    31. // 基于这个排列继续往下一个坑走去
    32. dfs(nth+1)
    33. // nums[i]让出当前坑位
    34. curr.pop()
    35. // 下掉“已用过”标识
    36. visited[nums[i]] = 0
    37. }
    38. }
    39. }
    40. // 从索引为 0 的坑位(也就是第一个坑位)开始 dfs
    41. dfs(0)
    42. return res
    43. };