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

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

相关推荐
handler016 分钟前
滑动窗口(同向双指针)算法:模板与例题解析
c语言·c++·笔记·算法·蓝桥杯·双指针·滑动窗口
Brilliantwxx9 分钟前
【算法题】基础计算器的不同实现方式
c++·算法
Sunsets_Red10 分钟前
P12375 「LAOI-12」MST? 题解
c++·算法·洛谷·信息学·oier·洛谷题解
雪度娃娃29 分钟前
多用户任务管理器
c++·个人开发
_深海凉_30 分钟前
LeetCode热题100-二叉树的直径
算法·leetcode·职场和发展
shylyly_30 分钟前
大小端字节序
数据结构·算法·联合体·大小端字节序·字节序判断
mmz120734 分钟前
深度优先搜索DFS3(c++)
c++·算法·深度优先
水蓝烟雨35 分钟前
3373. 连接两棵树后最大目标节点数目 II
算法·leetcode
故事和你9135 分钟前
洛谷-【图论2-1】树6
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
sali-tec36 分钟前
C# 基于OpenCv的视觉工作流-章73-点-线距离
图像处理·人工智能·opencv·算法·计算机视觉