题解 | #没有重复项数字的全排列#

没有重复项数字的全排列

http://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1

深度优先遍历+回溯算法

    let len = nums.length, result = [], visited = new Array(len).fill(false);

    const dfs = (depth, path, visited) => {
        // 遍历到叶子结点了,可以返回了
        if(depth === len) {
            result.push([...path]);
        }

        for(let i = 0; i < len; i++) {
            // 如果没遍历过
            if(!visited[i]) {
                // 压入 path 数组,然后是否遍历过的数组此下标处变为 true
                path.push(nums[i]);
                visited[i] = true;
                // 继续 dfs,直到最后一层
                dfs(depth + 1, path, visited);
                // 进行回溯,还原,以便下一次使用
                visited[i] = false;
                path.pop();
            }
        }
    }

    dfs(0, [], visited);
    return result;
}
module.exports = {
    permute : permute
};

要点

1:将问题想象为状态空间树 -->如何遍历树,得到叶子结点 2:设置状态变量,depth,path,visited.用来记录当前遍历节点的状态 3:递归是在for循环中实现的,注意回溯需要重置状态。递归的出口是当前结果的长度与原数组长度一致。

全部评论

相关推荐

10-11 15:42
皖西学院 Java
青鱼LINK:我硕士,也是java0面试,吾道不孤
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务