39. 组合总和

文章目录

题目

回溯: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

2 <= candidatesi <= 40

candidates 的所有元素 互不相同

1 <= target <= 40

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>>res;//结果数组
        vector<int>tmp;//暂存数组
        help(candidates,target,0,res,tmp);
        return res;
    }
    void help(vector<int>&candidates,int target,int start,vector<vector<int>>&res,vector<int>&temp){
            if(target==0){//若结果为0,符合条件将结果放入结果
                res.push_back(temp);
                return;
            }
            if(target<0){//若小于零直接进入下一轮
                return;
            }
            for(int i=start;i<candidates.size();i++){
                if(target-candidates[i]>=0){//添加的合法条件
                    temp.push_back(candidates[i]);//符合条件下将字符加入暂存数组
                    help(candidates,target-candidates[i],i,res,temp);//然后判断下一个字符
                    temp.pop_back();//回溯
                }
            }
    }
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

使用回溯+剪枝的方法

剪枝:因为所有符合的结果里会有重复的结果,需要选择节点后就不要再选择当前节点之前的节点。

逻辑:

递归枚举:逐个尝试将数组元素加入临时组合,不断减小目标值

结束条件:

目标值 = 0 , 找到有效组合,存入结果

目标值 < 0 , 组合无效,直接回溯

去重关键(剪枝):用start参数控制遍历起点,只从当前位置及之后选元素,避免重复组合

回溯:递归返回后,撤销最后一次选择,尝试其他可能。(回到之前走其他的路)

相关推荐
神仙别闹5 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员5 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
有点。5 小时前
C++03阶段练习(练习题)
数据结构·算法·图论
周末也要写八哥7 小时前
经典算法实例:游戏中弱角色的数量(二)
算法
是Yu欸7 小时前
鸿蒙PC移植:2048 从网页小游戏到 AI 桌面应用
大数据·人工智能·算法·数据挖掘·openharmony·codex
鹿角片ljp7 小时前
KV Cache 解析
java·算法
liliangcsdn8 小时前
IVOL与偏度因子的对比测量分析
算法
qq_199886878 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
threerocks9 小时前
Jev 入门第一课
算法
汉克老师10 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程