力扣小白刷题之40题组合总和Ⅱ

题目描述

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

分析

参考自:https://leetcode-cn.com/problems/combination-sum-ii/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-3/

与39题的区别:
39题:candidates中的数字可以无限制重复被选取
40题:candidates中的每个数字在每个组合中只能使用一次
编码的不同在于下一层递归的起始索引不一样。
39题:从候选数组的当前索引值开始。
40题:从候选数组的当前索引值的下一位开始。
相同之处:解集不能包含重复的组合。
为了使得解集不包含重复的组合,我们先对数组进行升序排序,重复的元素一定不是排好序以后的第一个元素和相同元素的第一个元素

思路

以target为根节点,依次减去数组中的数字,直到小于0或者等于0,把等于0的结果记录到结果集中:
1. 解集中不能包含重复的组合:对数组进行排序
2. candidates中的每个数字在每个组合中只能使用一次:按顺序依次减去数组中的元素,递归求解即可:遇到0就结算且回溯,遇到负数也回溯。
3. candidates中的数字可以重复:参考47题增加剪枝条件:(i > 0 && candidates[i] == candidates[i - 1] && !visited[i - 1])
或(i > start && candidates[i] == candidates[i - 1] ) 这样不需要传递visited数组
在这里插入图片描述

代码在这里插入图片描述

代码小优化在这里插入图片描述

注意

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值