Leetcode 46. 全排列

92 阅读2分钟

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

1.题目

给定一个不含重复数字的数组 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]]

2.思路

本题需要我们给出数组的全排列,这种全排列的题目我们很容易想到穷举的办法来解决,通过递归的方式不停的去尝试不同的情况,也就是回溯法,由于每个数在一次排列中只能使用一次,我们需要对已经使用过的数字做处理成已使用,避免它在下次使用,然后当本次排列结束后又将上次处理的数字恢复待使用状态。

首先我们创建一个递归函数以及一个保存结果的数组,然后递归函数接收两个参数一个是当前排列组合,另一个则是当前剩余可使用变量数组,然后在进入递归之后首先判断当前排列组合长度是否等于给定数字数组长度,如果相等则证明当前排列组合已经满足要求。 然后对当前剩余可使用变量数组进行遍历,然后在遍历中复制该数组并删除当前使用项。然后将当前排列组合添加当前删除使用项,并将当前排列组合以及删除当前使用项以后的数组作为参数继续调用递归函数。

3.代码

var permute = function(nums) {
    let res = []
    let deep = ((item,arr)=>{
        if(item.length===nums.length){
            res.push(item)
            return
        }
        arr.forEach((el,index)=>{
            let arr1 = JSON.parse(JSON.stringify(arr))
            arr1.splice(index,1)
            deep(item.concat([el]),arr1)
        })
    })
    deep([],nums)
    return res
};