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

    题目

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

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

    说明:

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

    样例

    示例 1:

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

    思路

    一开始是以为输出解的个数,那样的话大概率是dp问题。但是此题是输出具体解,那肯定就是搜索了。

    但是,每轮dfs都从第0个元素开始搜,那么肯定会出现重复的解。那么我们只要保证,下一轮的搜索情况,必须从当前元素开始(包括当前元素)。

    这样就可以避免重复解了。

    代码

    class Solution {
    public:
        vector<int> path;
        void dfs(vector<vector<int>>& rans, vector<int>& candidates, int i, int v){
            if(v == 0){
                rans.push_back(path);
                return;
            }
            for(int ii = i; ii < candidates.size() && v >= candidates[ii]; ii++){
                path.push_back(candidates[ii]);
                dfs(rans, candidates, ii, v - candidates[ii]);  
                path.pop_back();
            }
        }
    
    
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            vector<vector<int>> rans;
            sort(candidates.begin(), candidates.end());
            dfs(rans, candidates, 0, target);
            return rans;
        }
    };
    
  • 相关阅读:
    python操作redis
    Redis 安装试用
    python操作RabbitMQ
    pycharm快捷键
    各种python使用的坑
    RabbitMQ安装和使用
    Moosefs基本概念
    mesos客户端重新注册导致容器状态为staged
    初学Android 二 创建项目以及目录结构
    【杭电】[5631]Rikka with Graph
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12374508.html
Copyright © 2011-2022 走看看