LeetCode刷题之HOT100之组合总和

2024/6/3 周一,工作日的第一天。昨晚梦到被导师说去实验室不积极哈哈哈,风扇开到二级,早上被吹醒。买的书马上快要到了。上午刚来准备刷题,结果去搞了一下数据库sql,做的差不多了,还差点格式转换就差不多出回来了。现在来做题。

1、题目描述

在这里插入图片描述

2、逻辑分析

无重复数组,给一个目标值target,要求在数组中找出可以使数字和等于target的所有不同组合,且数组中的元素可以被重复使用。那么怎么解呢?我没有头绪,看看题解怎么说。官方题解给出算法是使用搜索回溯的方法,里面涉及到深度优先搜索递归计算。大致思路:将整个搜索过程用一个树来表达,即如下图呈现,每次的搜索都会延伸出两个分叉,直到递归的终止条件,这样我们就能不重复且不遗漏地找到所有可行解:
在这里插入图片描述
像上图中所示:一个个数计算,这样就不会有被遗漏的元素了。下面看具体代码实现。

3、代码演示

public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 创建一个结果列表,用于存储所有可能的组合
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        // 创建一个临时列表,用于存储当前正在构建的组合
        List<Integer> combina = new ArrayList<>();
        // 调用深度优先搜索方法,开始搜索所有可能的组合
        dfs( candidates,  target, res , combina, 0);
        // 返回结果列表 
        return res;
    }
    // 深度优先搜索方法,用于递归地搜索所有可能的组合
    public void dfs(int[] candidates, int target, List<List<Integer>> res , List<Integer> combina, int index){
        // 如果已经遍历完所有的候选数字,则直接返回
        if(index == candidates.length){
            return;
        }
        // 如果当前组合的数字之和已经等于目标值target,则将当前组合添加到结果列表中,并返回 
        if(target == 0){
            res.add(new ArrayList<Integer> (combina));
            return;
        }
        // 不选择当前数字,继续搜索下一个数字
        dfs(candidates, target, res, combina, index + 1);
        // 如果目标值target减去当前数字仍然大于等于0,则可以选择当前数字
        if(target - candidates[index] >= 0){
            // 将当前数字添加到当前组合中 
            combina.add(candidates[index]);
            // 递归调用dfs,目标值变为target减去当前数字 
            dfs(candidates,target - candidates[index], res, combina, index);
            // 回溯,将当前数字从组合中移除,以便尝试其他组合
            combina.remove(combina.size() - 1);
        }
    }

时间复杂度:O(S),其中 S 为所有可行解的长度之和。空间复杂度:O(target)。
边看边敲完这段代码,大致意思明了,但是对一些细枝末节的地方还是稍有欠缺,先放一放,下次再来看看。搞了几天的后端结果发现搞错了哈哈,只能重新开始啦,悲惨滴我呜呜呜。再见啦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暴力数据结构之排序大杂烩

1. 冒泡排序&#xff1a;O(N^2) 逻辑解析&#xff1a; 冒泡排序并没有什么实际意义&#xff0c;但是有教学意义&#xff0c;相信大部分小白在学习的初期第一个接触的排序就是冒泡排序。那么接下来我们了解一下他的底层逻辑&#xff1a; 冒泡排序顾名思义就是将最大&#xff08…

力扣 101. 对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool check(struct TreeNode* L,struct TreeNode* R){if(!L&…

匠心独运,B 端系统 UI 演绎华章之美

匠心独运&#xff0c;B 端系统 UI 演绎华章之美

kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心

1、群里有不定时会有同学反馈执行SQL脚本步骤使用有问题&#xff0c;那么咱们今天一起来学习下该步骤。trans中的执行SQL脚本有两方面功能&#xff0c;使用时需小心&#xff0c;不然很容易踩坑。 官方定义&#xff1a; 翻译&#xff1a; 您可以使用此步骤执行 SQL 脚本&#…

kafka集群内外网分流方案——筑梦之路

前言 在现代分布式系统架构中&#xff0c;Kafka作为一款高性能的消息队列系统&#xff0c;广泛应用于大数据处理、实时流处理以及微服务间的异步通信场景。特别是往往企业级应用中&#xff0c;业务网段和内网通信网段不是同一个网段&#xff0c;内网的机器想要访问业务数据只能…

考研人注意了:六月份保底进度+复习规划!

六月开始准备考研确实有点晚了&#xff0c;因为大家基本上上都是3月份开始的 开始的比别人晚&#xff0c;学习的时间就会比较紧张&#xff0c;但是不要怕&#xff0c;考研并不是比谁学的时间长&#xff0c;而是比谁学的效果好&#xff0c;就算是六月份开始&#xff0c;只要学习…

三、基于图像分类预训练编码及图神经网络的预测模型 【框图+源码】

背景&#xff1a; 抽时间补充&#xff0c;先挖个坑。 一、模型结构 二、源码

python结构化模式匹配switch-case,Python 3.10中引入,Python的模式匹配(pattern matching)语法

增加了采用模式加上相应动作的 match 语句 和 case 语句 的形式的结构化模式匹配。 模式由序列、映射、基本数据类型以及类实例构成。 模式匹配使得程序能够从复杂的数据类型中提取信息、根据数据结构实现分支&#xff0c;并基于不同的数据形式应用特定的动作。 语法与操作 模…

系统安全及应用11

一个新的服务器到手之后&#xff0c;部署服务器的初始化 1、配置IP地址 网关 dns解析&#xff08;static&#xff09;内网和外网 2、安装源外网&#xff08;在线即可&#xff09;&#xff0c;内网&#xff08;只能用源码包编译安装&#xff09; 3、磁盘分区&#xff0c;lvm …

coze自定义插件调用3

1&#xff0c;打开我的空间&#xff1b; 2&#xff0c;编辑&#xff0c;选择快捷指令 3&#xff0c;编辑指令 4&#xff0c;实际测试【输入框多了一个按钮“查询基础信息”&#xff0c;点击查询基础信息&#xff0c;提示输入缴费卡号&#xff0c;提交后如下图】

插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序 1.1 插入排序的基本思想 将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的元素插入完为止&#xff0c;就可以得到一个新的有序序列 。 实际上在我们的日常生活中&#xff0c;插入排序的应用是很广泛的&#xff0c;例如我…

从墙的功能出发 -分析欧特克Revit和广联达数维的差别

欧特克&#xff08;Autodesk&#xff09;在三维建模软件领域的影响力是有目共睹的&#xff0c;它是行业的头部产商&#xff0c;拥有众多的高质量的三维设计软件&#xff0c;涵盖了建筑设计、机械设计与制造和电影文娱行业。Revit是其发布的建筑三维建模软件&#xff0c;也是BIM…

老黄自己卷自己!GPU要一年更新一代!预告新动作:AI工厂将吞噬一切

站在 AI 时代风口浪尖的弄潮儿英伟达又为大家带来了一场科技饕餮盛宴&#xff01; 昨晚 7 点&#xff0c;坐标中国台湾大学体育场&#xff0c;英伟达 CEO 黄仁勋为世界带来了一场名为 The Dawn of a New Industrial Revolution &#xff08;揭开新工业革命序幕&#xff09;的演…

IDEA 常用技巧

1、代码块整体移动 选中&#xff0c;tab整体右移选中&#xff0c;shifttab整体左 移 2、统一修改变量 3.方法分割线 seting >> editor >> apperance >> show method separators 4、快捷键 构造器、set与get方法、方法重写、toString 等快捷操 鼠标停留在…

微信公众号开发(五):私信日志记录

之前的开发内容里&#xff0c;基本是基本配置和回复设置&#xff0c;为了之后看用户/粉丝什么样的功能使用的最多&#xff0c;需要增加私信的日志记录&#xff1a; 1、日志表 首先&#xff0c;要在mysql里建表 主要字段&#xff1a;用户id、公众号id、时间、私信类型、私信内…

SQL Developer 小贴士:备份和恢复连接信息

问题与概念 有时候SQL Developer需要重装&#xff0c;能备份和恢复连接信息就比较重要。 SQL Developer提供连接的导出和导入功能。 导出连接 第一步&#xff1a;选择连接。 第2步&#xff1a;指定输出文件&#xff0c;例如sqldconns.json 第3步&#xff1a;因为连接中可…

一文读懂数据库中的DB、DBMS、DBS、DBAS

目前数据库的应用非常广泛,几乎各行各业都在直接或间接地与数据库打交道,例如网上购物、银行业务、铁路购票和酒店住宿等。在实际应用中,数据库、数据库管理系统、数据库系统和数据库应用系统经常被统称为数据库,而实质上这4个概念是不一样的,它们具有不同的定义和含义。下…

16.FreeRTOS直接任务通知 Notification

FreeRTOS 直接任务通知 Notification 介绍 在嵌入式系统开发中&#xff0c;任务间的通信和同步是非常重要的一部分。而FreeRTOS就提供了多种机制来实现这些&#xff0c;比如队列、信号量和事件组。不过&#xff0c;使用这些机制都需要创建一个通信对象&#xff0c;不能直接把事…

【Unity Shader入门精要 第10章】高级纹理(一)

1. 立方体纹理原理 立方体纹理由6张图片组成&#xff0c;每张图片分别对应立方体的一个面。这6张图片代表沿世界空间下的轴线&#xff08;上下左右前后&#xff09;观察所得的图像 立方体的应用主要分为两类&#xff1a; 单纯利用6张图片的展示功能&#xff0c;为我们提供一…

怎么下载 jar 包

一、在Maven仓库里面下载 Maven仓库 网址&#xff1a;https://mvnrepository.com/ 二、搜索需要的 jar 包&#xff08;以 druid 为例&#xff09; 三、找到 druid jar包&#xff0c;点进去 四、找到自己需要的版本&#xff0c;点进去 五、 点 jar 下载