• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 3年前 (2022-04-09) 15次浏览 已收录 0个评论

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

<code class="javascript">/**
 * @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]
咱们执行上述代码,打印后果如下

<code class="javascript">[] [ 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中如果有雷同的元素,我间接过滤掉,不必再塞进去了,感兴趣的能够打印一下比照成果。因为太长我就不展现了


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于前端:Leetcode47全排列II回溯剪枝
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址