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参数控制遍历起点,只从当前位置及之后选元素,避免重复组合

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

相关推荐
码匠许师傅10 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试
坚持编程的菜鸟11 小时前
模拟实现memmove
c语言·算法·模拟实现memmove
wabs66613 小时前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
果果燕13 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
坚持编程的菜鸟13 小时前
编写判断大小端程序
c语言·算法·判断大小端
papaofdoudou13 小时前
判断排列逆序奇偶性的乘积判别法(范德蒙德符号法)
人工智能·算法
牛艺翔13 小时前
C++基础
开发语言·c++
键盘会跳舞13 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
linux-hzh13 小时前
百日算法修炼 · Day 03
java·算法
问商十三载14 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法