Leetcode 组合总和

在这里插入图片描述
这个Java代码实现的是LeetCode上的“组合总和”(Combination Sum)问题,采用的是回溯算法(Backtracking)。下面是详细的算法思想解释:

算法思想:

  1. 回溯算法的基本思路
    回溯算法是一种通过递归搜索所有可能解的算法。它会尝试构建一个解(在这里是一个数的组合),如果当前构建的解不符合条件(即总和超过目标值),就会撤销之前的选择,返回上一层递归,继续尝试其他可能的解。

  2. 步骤详解

    • 你有一组候选数 candidates,目标是找到所有可以让它们的组合之和等于 target 的组合。
    • 在回溯函数 backtrack() 中:
      • 递归结束条件
        • 如果当前的 target 为 0,说明找到了一个符合条件的组合,加入到结果集中。
        • 如果 target 小于 0,说明当前组合的总和超过了目标值,直接返回,放弃当前路径。
      • 递归过程
        • 遍历 candidates 数组中的每个数,从当前开始的位置 i 逐一尝试。因为题目允许同一个数字无限次使用,所以我们可以在递归调用时将 i 传入,而不是 i + 1,这样就可以重复选择当前数字。
        • 递归调用时,target - candidates[i] 表示我们减去当前选择的数字,继续递归寻找下一个可以加入的数字。
        • 每次递归返回后,将当前选择的数字从当前组合 current 中移除(即“回溯”),尝试其他可能的组合。
  3. 主要递归逻辑

    • 对于每一个候选数 candidates[i],首先将其加入当前组合 current,然后递归调用函数 backtrack(),继续尝试构建新的组合。
    • 如果找到了满足条件的组合(即 target == 0),则将当前组合加入到结果集中。
    • 如果当前组合无效(即 target < 0),直接返回。
    • 递归结束后,移除当前选中的数字(即回溯),以便继续尝试其他组合。

代码关键点:

  • 递归函数 backtrack():这是整个回溯过程的核心。在这个函数中,我们尝试向当前组合中添加新的数字,并递归地去寻找下一步的可能解。
  • 结果存储:通过递归逐步构建组合,当组合符合条件时,将其复制并添加到最终结果集中。
  • 去重:因为允许同一个数字多次使用,所以每次递归时,从当前数字 i 开始继续往后搜索,而不是重新从头开始。

总结:

该算法的复杂度取决于输入数组 candidates 的大小以及目标值 target。由于每个数字可以被多次使用,回溯算法会生成大量可能的组合,然后通过递归逐一验证。这种方法虽然可能会有较高的时间复杂度,但可以保证找到所有合法的组合。

java solution

class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result = new ArrayList<>();backtrack(result, new ArrayList<>(), candidates, target, 0);return result;}private void backtrack(List<List<Integer>> result, List<Integer> current, int[] candidates, int target, int start) {if(target == 0) {result.add(new ArrayList<>(current));//result.add(current); return;}if(target < 0) {return;}for(int i = start; i < candidates.length; ++i) {//添加当前元素current.add(candidates[i]);backtrack(result, current, candidates, target - candidates[i], i);//删除当前元素current.remove(current.size() - 1); //按照下标移除元素。}}
}

这一行代码中result.add(new ArrayList<>(current));为什么需要使用new,而不是result.add(current); ?

这是一个非常好的问题!让我为你详细解释一下为什么在这行代码中需要使用 new ArrayList<>(current),而不是直接使用 result.add(current)

原因:

当你在 result.add(current) 中直接添加 current 时,实际上是将当前列表 current 的引用添加到 result 中,而不是添加一个新创建的列表。这样做会导致一个引用问题:因为 current 是一个动态变化的列表,后续对 current 的修改会影响已经添加到 result 中的组合。

具体问题如下:

  • 假设你有一个 current 列表,并且你在回溯过程中不断修改它,比如通过 current.add()current.remove()
  • 如果你在 result.add(current) 中直接添加 current,其实添加的是它的引用,这意味着 result 中的每个组合实际上都是指向同一个 current 列表。
  • 当你继续回溯并修改 current 时,所有在 result 中已经添加的组合也会同步发生变化,因为它们指向的是同一个对象。

new ArrayList<>(current) 的作用:

为了避免这个问题,我们需要在将 current 添加到 result 时创建一个当前列表的副本。具体来说,new ArrayList<>(current) 会创建一个新的 ArrayList,并将 current 列表的所有元素复制到这个新列表中。这样一来,result 中的每个组合都是一个独立的列表,它们不会受到后续 current 列表修改的影响。

举例说明:

假设在某个时刻,current[2, 3],并且你使用 result.add(current) 添加它到 result,然后在回溯过程中,你又继续修改 current 变成 [2, 3, 7]。如果你没有创建 current 的副本,那么 result 中存储的也会变成 [2, 3, 7],这显然是不正确的,因为你之前想要存储的是 [2, 3]

然而,如果你使用 result.add(new ArrayList<>(current)),在添加 [2, 3] 时,result 会保存这个列表的副本,后续你修改 current 时,它不会影响到已经保存的组合。

小结:

  • result.add(current) 添加的是 current 的引用,后续对 current 的修改会影响 result 中的内容。
  • result.add(new ArrayList<>(current)) 创建了 current 的副本,从而确保每次添加到 result 中的是当前组合的快照,不会被后续的修改影响。

这个技巧在回溯算法中非常常见,因为回溯过程中我们通常会动态修改路径(组合),因此需要保存路径的副本以避免引用问题。

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

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

相关文章

考研前所学的c语言01(2024/10/15)

1.变量由字母数字下划线组成&#xff0c;但是首字母只能是字母和下划线 2.基本函数01 3.基本代码02&#xff08;符号常量&#xff09; 4. A 是字符常量&#xff08;character constant&#xff09;。它表示单个字符&#xff0c;并且它的类型是 char&#xff0c;一个字节 "…

无极低码课程【redis windows下服务注册密码修改】

下载Windows版本的Redis linux环境 (自行下载) 1.打开官网https://redis.io/downloads/ windows环境 1.打开github https://github.com/microsoftarchive/redis/releases 然后选择你喜欢的版本zip或msi下载 2.这里下载zip版,解压后后,打开安装目录 3.双击redis-server…

LabVIEW智能螺杆空压机测试系统

基于LabVIEW软件开发的螺杆空压机测试系统利用虚拟仪器技术进行空压机的性能测试和监控。系统能够实现对螺杆空压机关键性能参数如压力、温度、流量、转速及功率的实时采集与分析&#xff0c;有效提高测试效率与准确性&#xff0c;同时减少人工操作&#xff0c;提升安全性。 项…

ZW3D二次开发_文件_修改文件引用

1.假设零件图纸与工程图图纸关联&#xff08;默认情况下在零件图纸中新建工程图图纸会自动关联&#xff09; 可以通过查询-》关联文件 查看关联的文件 此时可以查看到零件图纸所关联的工程图图纸 当工程图图纸名字修改后&#xff0c;上图文件列表中的工程图图纸名将对应不上&a…

时空数据时序预测模型: HA、VAR、GBRT、GCN、DCRNN、FCCF、ST-MGCN

HA (Historical Average) HA (Historical Average&#xff0c;历史平均模型) 是一种基础的时间序列预测方法&#xff0c;通常用于预测具有周期性或季节性规律的数据。它通过计算历史上同一时间段的平均值来预测未来值&#xff0c;假设数据会遵循某种周期性的变化模式。以下是对…

Java项目-基于Springboot的智慧养老平台项目(源码+文档).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、SpringClud、Vue、Mybaits Plus、ELementUI工具&…

车辆管理新篇章:SpringBoot技术解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【计算机网络 - 基础问题】每日 3 题(四十七)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间

一.前言 在oracle数据库中&#xff0c;system为系统表空间&#xff0c;存放着一些我们经常用到的系统表和视图&#xff0c;sysaux为辅助表空间&#xff0c;辅助着系统表空间。这两个表空间不宜添加数据文件&#xff0c;会使系统表空间过于臃肿&#xff0c;从而影响数据库的使用…

014_django基于大数据运城市二手房价数据可视化系统的设计与实现2024_3ahrxq75

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

Ajax处理错误信息(处理响应报文)

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action""><div>用户名<input type"text" class"username"></div>…

IDEA如何配置自己的maven和maven设置阿里云仓库

前言 我们在使用IDEA开发Java应用时&#xff0c;一般是需要配置maven仓库的&#xff0c;那么我们应该如何配置呢&#xff1f;此外&#xff0c;默认的maven仓库下载速度很慢&#xff0c;我们一般可以配置阿里云或者华为云仓库&#xff0c;这个又应该怎么配置呢&#xff1f; 如…

(小白教程)MPV.NET 播放器安装和添加Bilibili弹幕

MPV.NET安装和添加脚本 MPV跨平台播放器&#xff1a;该播放器基于流行的mpv媒体播放器。mpv.net 设计为与 mpv 兼容&#xff0c;几乎所有 mpv 功能都可用&#xff0c;这意味着官方mpv 手册适用于 mpv.net&#xff0c;差异记录在mpv.net 手册中。 主要差异是mpv.net为MPV添加了现…

MySQL-MHA高可用集群部署(二)(MySQL MHA High Availability Cluster Deployment Part II )

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

vscode pylance怎么识别通过sys.path.append引入的库

问题 假如我有一个Python项目 - root_path -- moduleA ---- fileA.py -- moduleB ---- fileB.py# fileAimport sys sys.path.append(moduleB)import fileB # vscode pylance找不到&#xff0c;因为sys.path.append(moduleB)是动态添加的print(fileB)结果 代码正常运行但是vs…

高校企业数据可视化平台功能介绍/特色功能

数据可视化平台是一款适用于高校教学和各领域企业的零门槛可视化工具&#xff0c;能够解决高校数据分析与可视化类课程教学、实训问题。平台采用B/S结构&#xff0c;用户不需要下载客户端&#xff0c;可通过浏览器进行访问。 数据可视化平台提供多种指标设计&#xff0c;学…

C语言数据获取与类型转换问题

1、问题描述2、问题定位3、问题解决参考链接 1、问题描述 在项目中&#xff0c;需要从遥控指令中获取4字节的物体坐标X轴信息&#xff0c;并存储于一个float变量tmp中。物体坐标X轴原始数据为int型&#xff0c;存在负数&#xff0c;遥控指令中的数是加上了2^31&#xff0c;并按…

Mac中安装以及配置adb环境

一、adb介绍 Android 调试桥 (Android Debug Bridge) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff0c;例如安装和调试应用。adb 提供对 Unix shell&#xff08;可用来在设备上运行各种命令&#xff09;的访问权限。…

RA6M5——GPIO

文章目录 GPIO输入输出RASC图形化配置输出模式&#xff1a;输入模式&#xff1a;配置选项&#xff1a; 接口函数实例代码&#xff1a; GPIO输入输出 RASC图形化配置 输出模式&#xff1a; 输入模式&#xff1a; 配置选项&#xff1a; 配置项取值/描述Model “Input mode”&a…

揭开 `html2text` 库的神秘面纱:HTML到文本的完美转换

文章目录 **揭开 html2text 库的神秘面纱&#xff1a;HTML到文本的完美转换**1. 背景介绍2. 库简介3. 安装方法4. 函数用法4.1 基本转换4.2 自定义配置4.3 处理文件4.4 批量处理4.5 Markdown支持 5. 应用场景5.1 网页内容转文本5.2 数据分析5.3 内容备份 6. 常见问题及解决方案…