组合总和 (递归回溯+剪枝)

news/2024/11/20 13:29:21/

题目:

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

 解题思路:

本题采用递归回溯来实现,因为一个数字可以被重复使用,所以我们可以选择第index个数,也可以不选择第index个数

源代码如下:

class Solution {
public://递归回溯void dfs(vector<int>& candidates, int target,vector<int>& combine,vector<vector<int>>& res,int index){//若下标已经遍历到candidates.size()了,说明找完了,直接returnif(index>=candidates.size()) return;//若target==0,说明当前组合之和等于target,将combine保存到res中,并returnif(target==0){res.push_back(combine);return;}//不选当前的元素,直接跳过indexdfs(candidates,target,combine,res,index+1);//选择当前的元素if(target-candidates[index]>=0){//将当前元素存入临时数组combine中combine.push_back(candidates[index]);//继续递归,因为每个元素可以重复选择,所以这里的下标还是index//因为已经选择了index下标的元素,所以target就变了,需要减去当前元素值dfs(candidates,target-candidates[index],combine,res,index);//回溯combine.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> res;//最终结果vector<int> combine;//临时数组,用来保存当前的组合//dfs(candidates,target,combine,res,0);return res;}
};

升级题:

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

注意:解集不能包含重复的组合。

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

解题思路:

与上一题不同点在于,数字不能重复使用,一个数字只能用一次,那么我们需要通过剪枝,去除重复值,所以先将数组排序,在每次循环之前判断是否与前一个元素相等,从而去重。

因为一个数字只能使用一次,所以我们每次在递归时,下标index都要+1。

源代码如下:

class Solution {
public://采用回溯+剪枝(去掉重复结果)vector<vector<int>> res;//最终的结果数组vector<int> temp;//临时数组,存放当前组合void dfs(vector<int>& candidates, int target,int index){//当target为0时,说明当前数组temp中的组合总和为target,将 temp存放到res中并退出if(target==0){res.push_back(temp);return;}for(int i=index;i<candidates.size()&&target-candidates[i]>=0;i++){//剪枝,当前值与前一个相同,就进行下一轮循环if(i>index&&candidates[i]==candidates[i-1])continue;//将当前值存放到临时数组temp中temp.push_back(candidates[i]);//因为一个值只能用一次,所以下标变为i+1,这里的target注意要减去当前值dfs(candidates,target-candidates[i],i+1);//回溯temp.pop_back();}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {//对数组进行排序,方便对其进行剪枝sort(candidates.begin(),candidates.end());//调用递归函数dfs(candidates,target,0);//返回结果数组resreturn res;}
};

http://www.ppmy.cn/news/98465.html

相关文章

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明 可以让控制器内部的逻辑只执行一次&#xff1b;单次的范围是针对某…

【LeetCode热题100】打开第5天:最长回文子串

文章目录 最长回文子串⛅前言&#x1f512;题目&#x1f511;题解 最长回文子串 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识…

FAST-LIO论文阅读

论文&#xff1a;FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter 源码链接 各位大佬对论文的解析&#xff1a; FAST-LIO论文解读与详细公式推导 FAST-LIO是港大MaRS实验室在2021年提出的一个紧耦合迭代扩展卡尔曼滤波…

大数据技术之SparkCore

第1章 RDD概述 1.1 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象。 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD代表的是弹性、…

django组件552

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

携程算法岗笔试【20230525】

前两天写了携程的一道笔试题&#xff0c;感觉题目质量挺不错&#xff0c;这里记录一下。 1. 题目 题目大意如下&#xff1a; 现有n套试卷&#xff0c;每套试卷包含的题目数是i。游游每天的早上和下午都可以选择做一套试卷&#xff0c;当然也可以选择摸鱼&#xff08;不做题&a…

6.6.4 PCS创建Oracle 资源及资源组

在RHCS体系中&#xff0c;Oracle的启动是按以下顺序进行的&#xff1a; VIP。监听器。逻辑卷&#xff08;ISCSI共享出来的&#xff09;。文件系统&#xff08;在逻辑卷上创建&#xff09;。数据库实例。 上边这些资源&#xff0c;在PCS里创建好以后&#xff0c;将其组合成一个…

注册的业务、登录业务、个人中心、nginx配置【VUE项目】

登录与注册静态组件-&#xff08;处理共用图片资源问题&#xff09; 登录与注册功能&#xff08;git&#xff09;&#xff1a;必须要会的技能 登录与注册的静态组件assets文件夹----全部组件共用的静态资源在样式当中也可以使用符号【src别名】&#xff0c;切记在前面加上~ …