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

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

相关推荐
南境十里·墨染春水6 分钟前
讲讲移动语义
算法
西凉的悲伤14 分钟前
Guava类库——Range连续区间
java·算法·guava
菜菜的顾清寒15 分钟前
力扣HOT(100)54多维动态规划-最长公共子序列
算法·leetcode·动态规划
ouliten16 分钟前
C++笔记:C++20风格线程池
c++·笔记·c++20
随意起个昵称19 分钟前
线性dp-LIS题目3(合唱队形)
算法
weixin_4671822820 分钟前
Arduino进阶二|自定义类库保姆级教程(从零手写属于自己的传感器类库+完整源码)
c语言·c++·单片机·嵌入式硬件·arduino·c++面向对象·diy库文件
小六学编程25 分钟前
二分查找详解:从普通二分到左右边界
算法·c/c++
wayz1125 分钟前
Volume:PVO(百分比成交量震荡指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
毕竟是shy哥26 分钟前
PromptHash:基于亲和提示协同学习的自适应哈希检索跨模态算法
学习·算法·哈希算法
甄心爱学习26 分钟前
【项目实训(个人12)】
人工智能·python·算法