leetcode-46-全排列

1,565 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

题目地址

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

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

示例 2:

输入: nums = [0,1]
输出: [[0,1],[1,0]]

示例 3:

输入: nums = [1]
输出: [[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解题思路

数组中只有一个元素([1])的时候,全排列就只有 1 种([[1]]):
数组中有两个元素([1,2])的时候,全排列有 2 种([[1,2],[2,1]]);
数组中有三个元素([1,2,3])的时候,全排列有 6 种([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]])。
观察上面的结果可发现,全排列分别以每一个元素为第一个,然后以剩余的每一个元素为第二个,然后以剩余的每一个元素为第三个,以此类推...
很明显,每次选择一个剩余元素作为下一个元素的逻辑是相同的,所以本题可以通过递归解题。
递归函数接收两个参数(nums, arr) ,分别是待选择元素的数组和已选择元素的结果数组,每次遍历带选择数组,选取每一个作为下一个元素并递归调用该函数。递归函数的退出条件为 nums.length === 0,此时说明带选择元素的数组为空,找到了一个新的全排列,将其插入到结果数组即可。

代码实现

var permute = function(nums) {
  let res = []

  function getRes(nums,arr){
    if(nums.length===0){
      res.push(arr)
      return
    }
    
    for(let i = 0;i<nums.length;i++){
      const _arr = [...arr]
      const _nums = [...nums]
      _arr.push(_nums.splice(i,1))
      getRes(_nums,_arr)
    }
  }

  getRes(nums,[])

  return res
}

至此我们就完成了 leetcode-46-全排列

如有任何问题或建议,欢迎留言讨论!