leetcode LCR 083. 全排列

Problem: LCR 083. 全排列

思路

使用一个visited数组来记录每一轮递归中数字被使用情况,dfs

Code

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    const len = nums.length
    const cur = []  // 当前轮次的排列结果
    const res = []  // 结果汇总
    const visited = {}  // 记录数字是否被使用

    // 传入参数index是当前排列位置的索引, 从0开始, 第0个位置、第1个位置
    const dfs = (index) => {
        // 当前index和len相等,即碰到了此轮递归的边界, 那么记录结果
        if(index === len){
            // 将cur的浅拷贝添加到结果数组
            res.push(cur.slice())
            return 
        }
        // 遍历数组
        for(let i=0; i<len; i++){
            // 如果当前数字没有被处理过
            if(!visited[nums[i]]){
                // 标记当前数字为被处理
                visited[nums[i]] = 1
                // 把当前数字添加入全排列的一种情况
                cur.push(nums[i])
                // 沿着此次排列查找下一个数字
                dfs(index+1)
                // 清除尾部的nums[i]
                cur.pop()
                // 取消已用过标识, 释放给下一轮使用
                visited[nums[i]] = 0
            }
        }
    }
    // 从第一个元素开始遍历
    dfs(0)
    return res
};

你可能感兴趣的:(力扣刷题,leetcode,算法,javascript)