LeetCode(46):全排列

题目描述

image

解题思路

在写代码之前,思考以下3个问题:

  1. 如何判断是否已经满足结束条件?
  2. 如何在选择列表中选择一个?
  3. 如何撤销选择?

对全排列这个问题进行具体分析,逐一击破:

1、如何判断是否已经满足结束条件?

显然,每一种全排列的长度 与 题目给定的数组长度一致
因此,只需要比较路径的长度 与 题目给定的数组长度即可

2、如何在选择列表中选择一个?

从广义上说,选择列表就是题目给的数组
从狭义上说,因为题目要求“没有重复”,所以我们需要在选择列表中 剔除那些 已经被包含在路径中的
所以我们就用Set来标记当前路径中存在的元素(保证O(1)的时间复杂度)
每选择一个,就将其加入路径和Set中

3、如何撤销选择?

很简单,从路径中 以及 从Set中删除它即可

代码实现(JavaScript)

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    const res = new Array()
    const used = new Set()

    var dfs = function(path) {
        
        if(path.length === nums.length){
            res.push(path.slice())
            return
        }

        for(let i=0;i<nums.length;i++){
            if(used.has(nums[i])){
                continue
            }
            path.push(nums[i])
            used.add(nums[i])
            dfs(path)
            path.pop()
            used.delete(nums[i])
        }
    }

    dfs([])
    return res
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题目 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3],...
    禾木清清阅读 2,924评论 0 0
  • 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3...
    河海中最菜阅读 1,702评论 0 0
  • 题目:给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3],...
    minningl阅读 1,031评论 0 0
  • 从全排列看回溯算法 最近又刷起了算法,仿佛回到了大一时奋战到深夜场景,走上社会之初发现大学里学的都是啥玩意儿,工作...
    sealyun阅读 4,237评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,239评论 16 22

友情链接更多精彩内容