递归和回溯思想-数组全排列

145 阅读1分钟

描述

题目描述:给定一个没有重复数字的序列,返回其所有可能的全排列。

示例

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

思想

穷举,联想到DFS,使用的递归

递归就需要边界,这里的边界是访问到最后一个坑

用一个visited对象标记访问过的对象

代码

    function perOrder(nums){
        const length = nums.length
        const res = []
        const curArr = []
        const visited = {}
        
        function dfs(nth) {
            if(nth >= length) {
                res.push(curArr.slice())
                return
            }
            
            for(let i = 0; i < length; i++) {
                if(!visited[nums[i]]) {
                    curArr.push(nums[i])
                    visited[nums[i]] = true
                    dfs(nth + 1)
                    curArr.pop()
                    visited[nums[i]] = false
                }
            }
        }
        
        dfs(0)
        
        return res
    }