回溯组合求和算法---去重

文章介绍了如何通过回溯算法解决给定数组candidates中找到所有和为目标数target的组合问题,强调了处理重复元素和去重的重要性。作者构建了一个树形结构,并使用used数组管理状态,确保组合的唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。
说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
在这里插入图片描述
解题重点:集合(数组candidates)有重复元素,但还不能有重复的组合
解题思路:

1.组合问题抽象为树结构;
2.确定使用过的维度:“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过;
3.题目中,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。所以我们要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。

在这里插入图片描述

// 回溯 - 组合求和
window.onload = function () {
    const combinationSum = (candidates=[10,1,2,7,6,1,5], target=8) => {
        const res = [],path=[]
        candidates.sort((a,b)=>a-b)
        //使用used【i】标记当前迭代的状态,是处在树层还是树枝
        let used = new Array(candidates.length).fill(false)
        const backTracking = (startIndex,sum) => {
            if(sum === target){
                res.push(Array.from(path))
                return
            }
            for(let i = startIndex;i < candidates.length;i++){
                let currentNum = candidates[i]
                if(currentNum>target){break}
                //如果和上一个值相同,且处于横向回溯的过程中,就跳出当前迭代
                if(candidates[i] === candidates[i-1] && !used[i-1]){continue}
                path.push(currentNum)
                sum += currentNum
                used[i] = true

                backTracking(i+1,sum)
                sum -= currentNum
                path.pop()

                used[i] = false
            }
        }
        backTracking(0,0)
        return res
    }
    console.log(combinationSum())
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aliven1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值