📝Leetcode 46-全排列

143 阅读1分钟

题目🌵

📝Leetcode 46 全排列

✏️leetcode-cn.com/problems/pe…


给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路💡

  • 递归+回溯

  • 回溯的本质就是穷举,我们这里可以抽象成一个n叉树

    • 回溯需要终止条件

    • 在当前题目中,当路径中的元素个数===数组元素个数,即为一组排列组合

      if (path.length === k) {
          res.push([...path])     //当数组元素===原来数组的个数,说明一种排列组合完成
          //递归终止
          return
      }
      
    • 定义used数组,为了保证当前的排列中用的元素唯一

var permute = function (nums) {
    const res = [],
          path = []
    const len = nums.length;
    backtracking(nums, len, [])
    return res

    function backtracking(n, k, used) {
        if (path.length === k) {
            res.push([...path])     //当数组元素===原来数组的个数,说明一种排列组合完成
            //递归终止
            return
        }
        for (let i = 0; i < k; i++) {
            if (used[i]) continue   //遍历过的跳过
            path.push(n[i])         //存入当前路径
            used[i] = true          //标记当前元素已经被使用
            backtracking(n, k, used) // 递归下一层节点  dfs 深度遍历
            path.pop()              //撤销操作,将当前路径出栈一位,回溯
            used[i] = false         //撤销操作
        }
    }
}

image-20220304005747128