zoukankan      html  css  js  c++  java
  • LeetCode(39):组合总和

    Medium!

    题目描述:

    给定一个无重复元素的数组 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]
    ]

     

    解题思路:

    像这种结果要求返回所有符合要求解的题十有八九都是要利用到递归,而且解题的思路都大同小异。

    如果仔细研究这些题目发现都是一个套路,都是需要另写一个递归函数,这里我们新加入三个变量,start记录当前递归到的下标,out为一个解,res保存所有已经得到的解,每次调用新的递归函数时,此时的target都要减去当前数组里的数。

    C++ 解法一:

     1 class Solution {
     2 public:
     3     vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
     4         vector<vector<int> > res;
     5         vector<int> out;
     6         sort(candidates.begin(), candidates.end());
     7         combinationSumDFS(candidates, target, 0, out, res);
     8         return res;
     9     }
    10     void combinationSumDFS(vector<int> &candidates, int target, int start, vector<int> &out, vector<vector<int> > &res) {
    11         if (target < 0) return;
    12         else if (target == 0) res.push_back(out);
    13         else {
    14             for (int i = start; i < candidates.size(); ++i) {
    15                 out.push_back(candidates[i]);
    16                 combinationSumDFS(candidates, target - candidates[i], i, out, res);
    17                 out.pop_back();
    18             }
    19         }
    20     }
    21 };
  • 相关阅读:
    Angular1.0
    当今流行的 React.js 适用于怎样的 Web App?
    bower的权限问题
    淡定啊淡定
    JBoss for luna
    JQuery的二维码插件
    今天学人家玩云主机
    laravel5.2/laravel5.3入门指南 Windows 上快速安装并运行 Laravel 5.x
    验证mySqli扩展是否
    Amazon EC2 的名词解释
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9138630.html
Copyright © 2011-2022 走看看