【LeetCode】40. 组合总和 II
40. 组合总和 II
知识点:递归;回溯;组合;剪枝
题目描述
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
注意:解集不能包含重复的组合。
示例
解法一:回溯
回溯算法的模板:
核心就是for循环里的递归,在递归之前做选择,在递归之后撤销选择;
本题又和39题不一样了,我们来看一下不一样的点在哪里
- 本题数组中的每个数字在每个组合里只能选一次,不能重复选择。 -- > 所以每次的选择列表里的搜索起点从i+1开始。
- 本题中的数组是有重复的,39题是无重复的。这带来一个问题就是可能会选到一样的,举个例子,就比如上面的例2,排完序后是12225,然后第一种组合选了122(注意这个树枝上我们是可以选第2个2的,因为本身它就有很多嘛),然后第2个2撤销了,选第3个2,这其实是不可以的,因为这也是122,重复了。所以可以总结:一条树枝可以重复,同一树层不可以重复。
所以使用一个used数组来标记那个元素被选择过。candidates[i] == candidates[i - 1] 并且 used[i - 1] == false,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。
可以看出在candidates[i] == candidates[i - 1]相同的情况下:
- used[i - 1] == true,说明同一树支candidates[i - 1]使用过
- used[i - 1] == false,说明同一树层candidates[i - 1]使用过
。
体会
- 要能够把这种决策树画出来;
- 在求和问题中,排序之后加上剪枝是很常见的操作,能够舍弃无关的操作;
相关链接
__EOF__

本文作者:Curryxin
本文链接:https://www.cnblogs.com/Curryxin/p/15139543.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Curryxin/p/15139543.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了