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

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

相关推荐
灵感__idea1 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
lwf0061643 小时前
导数学习日记
学习·算法·机器学习
头发够用的程序员4 小时前
从滑动窗口到矩阵运算:img2col算法基本原理
人工智能·算法·yolo·性能优化·矩阵·边缘计算·jetson
武帝为此4 小时前
【数据清洗缺失值处理】
python·算法·数学建模
Halo_tjn5 小时前
Java 基于字符串相关知识点
java·开发语言·算法
念越5 小时前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
万法若空5 小时前
C++ <memory> 库全方位详解
开发语言·c++
黎阳之光5 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
代码中介商5 小时前
C++ 类型转换深度解析:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
青小莫6 小时前
C++之string(OJ练习)
开发语言·c++·stl