关于前端:Leetcode47全排列II回溯剪枝

给定一个可蕴含反复数字的序列 nums ,按任意程序 返回所有不反复的全排列。

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    let res = []
    function dfs(arr,rest){
    console.log(arr,rest)
        if(arr.length === nums.length){
            res.push(arr)
            return
        }

        for(let i=0;i<rest.length;i++){
            if(rest.indexOf(rest[i]) !== i){
                continue
            }else{
                arr.push(rest[i])
                let newRest = [...rest]
                newRest.splice(i,1)
                dfs([...arr],newRest)
                arr.pop()
            }
        }
    }
    dfs([],nums)
    return res
}

这道题还是思考了挺久的,看着一些解答办法的代码片段感觉不是那么很好了解。有的还要排序啊很麻烦觉着。
没想到早晨吃完饭回来居然了解了一些
回溯都晓得,重点是要去重
对于字符串的话去重简略一些
然而对于这道题,每一项外面也是一个字符串,还是剪枝比拟好。
既然剪枝的逻辑在于残余可选项中是否有反复项,那间接将有反复项的跳过不就行了?
举个简略实例
const nums = [1,1,2,2]
咱们执行上述代码,打印后果如下

[] [ 1, 1, 2, 2 ]
[ 1 ] [ 1, 2, 2 ]
[ 1, 1 ] [ 2, 2 ]
[ 1, 1, 2 ] [ 2 ]
[ 1, 1, 2, 2 ] []
[ 1, 2 ] [ 1, 2 ]
[ 1, 2, 1 ] [ 2 ]
[ 1, 2, 1, 2 ] []
[ 1, 2, 2 ] [ 1 ]
[ 1, 2, 2, 1 ] []

也就是说,rest中如果有雷同的元素,我间接过滤掉,不必再塞进去了,感兴趣的能够打印一下比照成果。因为太长我就不展现了

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理