组合总和 2 回溯法40

本文介绍了一个使用回溯法解决组合总和 II的算法,避免重复调用同一元素并确保没有重复解。通过排序和剪枝优化,当目标值等于0时将当前加和数组加入结果,当下一目标值小于待加和数或达到数组边界时终止。通过遍历和条件判断来避免重复解并进行剪枝。
摘要由CSDN通过智能技术生成

思路:和39题的区别是,不能重复调用给定的元素自身,和上一题的相同点是,都不可以有重复解
回溯法最主要的两点,一点是类似于递归,如果符合当前条件就继续继续进行下去,如果不符合则终止,跳到上一循环,
同时对这一循环中的某些已经改变的量还原。
这题为了避免重复调用某个元素,需要做一个判断,
如目标list:[1,2,2,2,5] , target = 5
若1,2,2(前两个2)已经实现,返回上一循环[1,2], 不需要再调用第三个2,直接进行第5这个元素判断是某满足要求。
ref:https://leetcode-cn.com/problems/combination-sum-ii/solution/hui-su-jian-zhi-zhu-xing-jie-shi-python3-by-zhu_sh/
回溯法+排序剪枝
特判,若candidatescandidates为空,则返回[][]

回溯函数helper()helper(),传入参数:下一加和索引ii,当前已加和数组tmptmp,下一目标targettarget

若target0target0,说明当前和满足条件,将当前加和数组tmptmp加入resres,并return。
剪枝 因为已经将candidatescandidates排序,所以当下一目标小于下一待加和数时,return。并且当下一待加和索引inin时,return。为了防止数组越界,将条件inin放在target<candidates[i]target<candidates[i]之前

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯法求解组合总和的主要思路是:对于每个数字,可以选择使用或不使用,如果使用了,则将其加入当前组合中,并继续考虑剩下的数字;如果不使用,则直接考虑剩下的数字。当目标值减为0时,说明已经找到了一个符合要求的组合。 以下是一个求解组合总和的JavaScript代码示例: ```javascript function combinationSum(candidates, target) { const res = []; candidates.sort((a, b) => a - b); // 排序 backtrack([], 0, target); return res; function backtrack(path, start, target) { if (target < 0) return; // 如果目标值小于0,说明不符合要求,结束当前回溯 if (target === 0) { // 如果目标值等于0,说明已经找到了一个符合要求的组合 res.push([...path]); return; } for (let i = start; i < candidates.length; i++) { path.push(candidates[i]); // 将当前数字加入组合中 backtrack(path, i, target - candidates[i]); // 继续考虑剩下的数字 path.pop(); // 回溯,将当前数字从组合中移除 } } } ``` 在代码中,backtrack函数用于进行回溯。它接受三个参数:当前组合path、起始数字的下标start和目标值target。在函数中,遍历候选数字数组,对于每个数字,有两种选择:使用或不使用。如果使用,将其加入当前组合path,继续考虑剩下的数字;如果不使用,直接考虑剩下的数字。当目标值减为0时,说明已经找到了一个符合要求的组合,将其加入结果数组res中,并退出当前回溯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值