首页 > 其他分享 >组合总和(回溯)

组合总和(回溯)

时间:2024-12-31 21:30:48浏览次数:6  
标签:target 组合 start vector candidates 回溯 总和

给你一个 无重复元素 的整数数组 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
输出: []

class Solution {
public:
    // 存储所有可能组合的结果集
    vector<vector<int>> res;
    // 临时存储当前递归路径下的组合
    vector<int> temp;

    // 回溯函数,用于生成所有和为target的组合
    // candidates: 可选的数字列表
    // target: 目标和
    // start: 当前搜索开始的索引位置
    void backtrack(vector<int>& candidates, int target, int start) {
        // 如果目标和为0,说明找到了一组符合条件的组合
        if (target == 0) {
            // 将当前组合加入结果集中
            res.push_back(temp);
            return;
        }
        // 如果目标和小于0,说明当前组合已不符合条件,直接返回
        if (target < 0) {
            return;
        }

        // 遍历从start到candidates末尾的所有元素
        for (int i = start; i < candidates.size(); i++) {
            // 将当前元素加入当前组合中
            temp.push_back(candidates[i]);
            // 递归调用,继续寻找剩余部分的组合,允许重复使用当前元素
            backtrack(candidates, target - candidates[i], i);
            // 回溯:撤销上一步的选择,尝试其他可能性
            temp.pop_back();
        }
    }

    // 主函数,返回所有和为target的不同组合
    // candidates: 可选的数字列表
    // target: 目标和
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        // 调用回溯函数开始搜索
        backtrack(candidates, target, 0);
        // 返回最终找到的所有组合
        return res;
    }
};

 

标签:target,组合,start,vector,candidates,回溯,总和
From: https://www.cnblogs.com/yueshengd/p/18644792

相关文章

  • 排列组合初步
    排列组合初步1.公式部分排列数从\(n\)个不同元素中任取\(m\)(\(m\leqn\),,\(m\)和\(n\)均为自然数)个元素组成一个排列。排列数公式如下:\(A_{n}^{m}=\frac{n!}{(n-m)!}\)理解:第一个位子有\(n\)个选择,第二个位子有\(n-1\)个选择,以此类推,第\(m\)个有\(n-m+1\)个选择,于是得......
  • 电话号码的字母组合(回溯)
    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf&qu......
  • 多步预测更新 | 基于Transformer的组合预测模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客拒绝信息泄露!VMD滚动分解+Informer-BiLSTM并行预测模型-CSDN博客单步预测-风速预测模型代码全家桶......
  • 组合模式
    实验10:组合模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解组合模式的动机,掌握该模式的结构;2、能够利用组合模式解决实际问题。 [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。实验要求:1.文件的执行不需真正实现,只需简单提......
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>
    题目:  解析: 决策树:  代码设计:  代码: 写法一:path为全局变量privateintret,path,aim;publicintfindTargetSumWays(int[]nums,inttarget){aim=target;dfs(nums,0);returnret;}privatevoiddfs(i......
  • 子集(回溯)
    给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2:输入:nums=[0]输出:[[],[0]] class......
  • 全排列(回溯)
    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:输入:nums=[0,1]输出:[[0,1],[1,0]]示例3:输入:nums=[1]输出:[[1]]classSol......
  • UML之组合与聚合
    关联和链接关系在很多情况下是对称的,即被关联的两个类都有以自己为源端对方为目标端的角色存在,而且角色与源端类的属性是等价的,即在关联一端的关联端(角色)等价于另外一端的属性。例如,在下图中,我们可以认为author:Person是类Book的一个属性,而myBooks:Person是类Person的一个属性。......
  • 从家谱的层级结构 - 组合模式(Composite Pattern)
    组合模式(CompositePattern)组合模式(CompositePattern)组合模式概述组合模式涉及的角色talkischeap,showyoumycode总结组合模式(CompositePattern)组合模式(CompositePattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组......
  • 记一个itertools排列组合和列表随机排序的例子
    朋友不知道哪里弄来了一长串单词列表,一定要搞个单词不重复的组合。那么这个时候我们就可以想到读书时所学的排列组合知识了,而这个在Python中可以怎么实现呢?我记录如下:使用itertools模块实现排列组合在Python中,排列组合可以通过itertools模块来实现。以下是两个主要函......