leetcode40. 组合总和 II

举报
兔老大 发表于 2021/04/24 00:08:59 2021/04/24
【摘要】 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 ...

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

candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]
示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

 思路:经典搜索回溯,代码很清楚


  
  1. import java.util.ArrayDeque;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Deque;
  5. import java.util.List;
  6. public class Solution {
  7. /**
  8. * @param candidates 候选数组
  9. * @param len
  10. * @param begin 从候选数组的 begin 位置开始搜索
  11. * @param residue 表示剩余,这个值一开始等于 target,基于题目中说明的"所有数字(包括目标数)都是正整数"这个条件
  12. * @param path 从根结点到叶子结点的路径
  13. * @param res
  14. */
  15. private void dfs(int[] candidates, int len, int begin, int residue, Deque<Integer> path, List<List<Integer>> res) {
  16. if (residue == 0) {
  17. //找到了
  18. res.add(new ArrayList<>(path));
  19. return;
  20. }
  21. for (int i = begin; i < len; i++) {
  22. // 大剪枝
  23. if (residue - candidates[i] < 0) {
  24. break;
  25. }
  26. // 小剪枝
  27. if (i > begin && candidates[i] == candidates[i - 1]) {
  28. continue;
  29. }
  30. path.addLast(candidates[i]);
  31. // 因为元素不可以重复使用,这里递归传递下去的是 i + 1 而不是 i
  32. dfs(candidates, len, i + 1, residue - candidates[i], path, res);
  33. path.removeLast();
  34. }
  35. }
  36. public List<List<Integer>> combinationSum2(int[] candidates, int target) {
  37. int len = candidates.length;
  38. List<List<Integer>> res = new ArrayList<>();
  39. if (len == 0) {
  40. return res;
  41. }
  42. // 先将数组排序,这一步很关键
  43. Arrays.sort(candidates);
  44. Deque<Integer> path = new ArrayDeque<>(len);
  45. dfs(candidates, len, 0, target, path, res);
  46. return res;
  47. }
  48. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104037309

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。