组合总和

news/2025/1/29 22:36:29/文章来源:https://www.cnblogs.com/Xhita/p/18694922
>"是谁在新年旅行时还在写题解我不说"

戳我看原题

题目大意

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

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

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

思路

经常写题的佬们一定都看出来了,这是一道简单的回溯(dfs)题,同样的,也可看作一道dp题,采用完全背包问题的板子就能解决。
我的写法是dfs。

什么是dfs?

别问我,我不知道

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接

dfs应该如何去写?

这边是一个我经常用的模板(仅供参考)

点击查看代码
vector<int> path;vector<vector<int>> result;void backTracking(......) {if (......) {......return;}for (int i = 0; i < size; ++i) {path.emplace_back(......);backTracking(......);path.pop_back();}}

有关dfs的剪枝

我们不难看出看不出也算了如果不剪枝得出的答案会出现重复现象,因此在进行回溯时本层起始元素的下标必须大于或等于上一层元素的下标。
代码实现请看下文。
你以为本文就只有这一点吗?
不,接下来是lambda!

lambda表达式

为何我会在本文提到lambda?因为这是力扣中的回溯(递归思想)题,Lambda表达式可以使代码更加简洁和易读,并且看起来也更高级

简单理解lambda

放个链接:
https://blog.csdn.net/m0_60134435/article/details/136151698

lambda中dfs的写法:

auto dfs = [&](auto&& dfs, int i, int j) -> int {}
注意,在递归使用dfs时应写为dfs(dfs,i,j);

代码实现

点击查看代码
class Solution {
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {int n=candidates.size();vector<vector<int>>x;vector<int>y;auto dfs = [&] (auto&& dfs,int num,int next) {if(num>=target){if(num==target){x.push_back(y);}return ;}for(int i=next;i<n;i++){y.push_back(candidates[i]);dfs(dfs,num+candidates[i],i);y.pop_back();}};dfs(dfs,0,0);return x;}
};
天太冷,我就不写注释了,我相信各位大佬是看得懂我的代码的(*^_^*)。

总结

这道题是个极其基础的板子题,这篇题解主要是想让大家了解一下lambda的递归用法(虽然说感觉没人会看)。
Xhita我目前正坐在宾馆的温暖被窝中,你问我去了哪里?
避暑圣地神农架!
所以说谁会在大冬天去神农架啊,还是大年初一,路上吃的都没有

最后,祝大家新年快乐!在新的一年里也要多多wa哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876942.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发编程 - 线程同步(二)

ThreadStatic实现线程本地存储,避免共享资源问题;ThreadLocal解决其缺陷;volatile关键字防止缓存和编译器优化,非完整线程同步机制。经过前面对线程同步初步了解,相信大家对线程同步已经有了整体概念,今天我们就来一起看看线程同步的具体方案。01、ThreadStatic 严格意义…

深度学习基础理论————混合专家模型(MoE)/KV-cache

1、混合专家模型(MoE) 参考HuggingFace中介绍:混合专家模型主要由两部分构成: 1、稀疏的MoE层:这些层代替了传统 Transformer 模型中的前馈网络 (FFN) 层。MoE 层包含若干“专家”(例如 8 个),每个专家本身是一个独立的神经网络。在实际应用中,这些专家通常是前馈网络 (…

gin: 使用独立的路由文件和controller文件

一,目录结构:二,代码: 1,controller/ImageController.go package controllerimport ("github.com/gin-gonic/gin""net/http" )type ImageController struct{}func NewImageController() ImageController {return ImageController{} }//得到详情 func (i…

2024年终总结——我自风中来,又往风中去

目录前言碎语事件简单记录(参考自己的朋友圈)疑为前城去连云港——小青岛,南北交,桃花源记忆点不大的一些城市……上海——夜之城北京——梦之城似是故人来技术或科研——向现实进发生活——认识我,改变我绩点——继续维稳比赛——淡化、反思音乐——重拾展望——勇敢的向…

Java 序列化流

目录概述ObjectOutputStream类构造方法序列化操作ObjectInputStream类构造方法反序列化操作1反序列化操作2 概述 Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后…

【持续更新】【专题】初等数论【更新逆元】

【持续更新】【专题】初等数论 Designed By:FrankWkd 【100%原创】【禁止搬运】 Updated at 2025.01.26 前言:主要从线性筛开始速通初等数论 尽可能的多证明结论而不是阐述结论。如果你只是想回顾结论,请看其他人的 \(Blog\) .一、基础概念整除:对于两个正整数 \(a,b\), 存…

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) @目录四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)2.hash 哈希表常用指令(详细讲解说明)2.1 hset <key><field><value> 给<…

qcom usb PD tcpc overview

该软件层将PMxxxxB硬件连接到LPM模块,因为上述模块使用Type-C端口控制器接口(TCPCI)进行通信。 软件层,使PMIC Type-C PD硬件适用于基于TCPCI的软件架构 基本状态机:进入、离线、待机状态 PMIC Type-C和PD PHY中断的消费者 PMIC硬件专用排序和定时器

男生如何自己简单理发

快过年了,给自己理个发。 从24年10月份开始,目前已经给自己理发两次,都是短发寸头,给我爸和我三叔各理发一次,算是有点经验了,我准备过年前给自己再稍微修理头发一下。自己动手实践,且效果还不错的情况下,真的非常有成就感,如果有人指导情况下,其实自己理发难度不高,…

测序中的GC偏好

001、 测序中的GC偏好指的是基因组上GC含量在50%左右的区域更容易被测到,产生的reads更多,这些区域的覆盖度更高,在高GC或者低GC区域,不容易被测到,产生较少的reads,这些区域的覆盖度更少。用基因组单位长度的bin中的GC含量作为横坐标,覆盖度作为纵坐标作图,可以明显的…

人工智能(AI)简史:推动新时代的科技力量

人工智能(AI,Artificial Intelligence)是计算机科学的一个分支,旨在研究和开发可以模拟、扩展或增强人类智能的**系统**。它涉及多种技术和方法,包括机器学习、深度学习、自然语言处理(NLP)、计算机视觉、专家系统等。一、人工智能简介 人工智能(AI,Artificial Intell…

03. vim编辑器的使用

一、vim编辑器的使用vim 是 Unix 和 类 Unix 操作系统中常用的文本编辑器。如果 Ubuntu 系统默认没有安装 vim,我们可以使用 apt 工具安装 vim 编辑器。sudo apt install vim安装好 vim 之后,我们可以如下命令编辑一个文件。 vim 文件用 vim 打开一个文件就直接进入了 一般模…