• LeetCode 39. 组合总和(Combination Sum)


    题目描述

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

    candidates 中的数字可以无限制重复被选取。

    说明:

    • 所有数字(包括 target)都是正整数。
    • 解集不能包含重复的组合。 

    示例 1:

    输入: candidates = [2,3,6,7], target = 7,
    所求解集为:
    [
      [7],
      [2,2,3]
    ]
    

    示例 2:

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

    解题思路

    考虑用回溯法解题。首先将数组从小到大排序,然后从第一个数字开始遍历,若该数字不大于当前目标值,则将其加入到结果数组中,然后把目标值减去当前数字,并从当前数字开始向后递归寻找下一个满足上述条件的数字。若到某一步为止目标值为0,则将当前结果数组加入到集合中。每个数字向后遍历完之后,将其从结果数组中去除,从下一个数字开始继续寻找,直到走到数组末尾或者没有不大于目标值的数。

    代码

     1 class Solution {
     2 public:
     3     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
     4         sort(candidates.begin(),candidates.end());
     5         vector<vector<int>> res;
     6         vector<int> temp;
     7         if(candidates.size())
     8             combi(candidates,target,temp,res,0);
     9         return res;
    10     }
    11     void combi(vector<int>& candidates, int target, vector<int>& temp, vector<vector<int>>& res, int start){
    12         if(target==0)
    13             res.push_back(temp);
    14         else{
    15             int i=start;
    16             while(i<candidates.size()&&candidates[i]<=target){
    17                 temp.push_back(candidates[i]);
    18                 combi(candidates, target-candidates[i], temp, res, i);
    19                 temp.pop_back();
    20                 i++;
    21             }
    22         }
    23     }
    24 };
  • 相关阅读:
    团队开发冲刺第二十天
    团队开发冲刺第十九天
    第十六周进度总结
    学期课后个人总结
    用户场景分析
    第十五周进度总结
    对正在使用的输入法进行评价
    java中实现客户姓名添加和显示
    指定查找区间,查找学生姓名并显示是否修改成功
    linux下如何修改文件的权限chmod
  • 原文地址:https://www.cnblogs.com/wmx24/p/9015634.html
Copyright © 2020-2023  润新知