• LeetCode刷题系列 -- 39. 组合总和


    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

    candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 

    对于给定的输入,保证和为 target 的不同组合数少于 150 个。

    示例 1:

    输入:candidates = [2,3,6,7], target = 7
    输出:[[2,2,3],[7]]
    解释:
    2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
    7 也是一个候选, 7 = 7 。
    仅有这两种组合。
    示例 2:

    输入: candidates = [2,3,5], target = 8
    输出: [[2,2,2,2],[2,3,3],[3,5]]
    示例 3:

    输入: candidates = [2], target = 1
    输出: []
     

    提示:

    1 <= candidates.length <= 30
    1 <= candidates[i] <= 200
    candidate 中的每个元素都 互不相同
    1 <= target <= 500

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/combination-sum
     

    思路:回溯算法秒杀所有排列/组合/子集问题 :: labuladong的算法小抄

    回溯算法

    java:

    1. class Solution {
    2. public List<List<Integer>> combinationSum(int[] candidates, int target) {
    3. List<List<Integer>> result = new LinkedList<>();
    4. backtrack1(candidates,target,0,0,new LinkedList<>(),result);
    5. return result;
    6. }
    7. public void backtrack1(int[] candidates, int target, int start,int subSum, List<Integer> subSet, List<List<Integer>> result) {
    8. // 递归终止条件,组合的和等于 target,则将组合放到 result 中
    9. if(subSum==target) {
    10. result.add(new LinkedList<>(subSet));
    11. return;
    12. }
    13. // 递归终止条件,组合的和大于 target,说明不必再遍历下去
    14. if(subSum>target) {
    15. return;
    16. }
    17. for(int i=start;i<candidates.length;i++) {
    18. subSet.add(candidates[i]);
    19. subSum += candidates[i];
    20. // 因为元素的可复选的,所以下次遍历仍然课从 i 开始
    21. backtrack1(candidates,target,i,subSum,subSet,result);
    22. subSet.remove(subSet.size()-1);
    23. subSum -= candidates[i];
    24. }
    25. }
    26. }

    c++

    1. class Solution {
    2. public:
    3. vector<vector<int>> result;
    4. vector<vector<int>> combinationSum(vector& candidates, int target) {
    5. if(candidates.size() == 0) {
    6. return result;
    7. }
    8. vector<int> sub_vec;
    9. dfs(candidates, target, 0, sub_vec);
    10. return result;
    11. }
    12. void dfs(vector<int>& candidates, int target, int start, vector<int>& sub_vec) {
    13. if(target < 0) {
    14. return;
    15. }
    16. if(target == 0) {
    17. result.push_back(sub_vec);
    18. return;
    19. }
    20. for(int i=start; i<candidates.size(); i++) {
    21. sub_vec.push_back(candidates[i]);
    22. dfs(candidates, target-candidates[i], i, sub_vec);
    23. sub_vec.pop_back();
    24. }
    25. }
    26. };

  • 相关阅读:
    ES6 对象面试题
    30分钟使用百度EasyDL完成车辆分类识别
    Qt 基本知识
    【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入
    spdk 建立的用户态页表
    01贪心:算法理论知识
    SpringMVC
    视频点播系统,视频播放器,在线视频点播学习系统毕业设计
    基于SSM框架的大学生自主学习网站的设计与开发/在线学习系统
    原型制作与图解
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/126475872