深入解析力扣39.组合总和:回溯算法的妙用

news2025/4/3 6:25:35

题目描述

给定一个无重复元素的数组 candidates 和一个目标值 target,找出 candidates 中所有可以使数字和为 target 的组合。数组中的数字可以被重复使用。

示例:

输入: candidates = [2,3,6,7], target = 7
输出: [[2,2,3],[7]]

代码解析

class Solution {
    // 记录当前的组合路径
    public List<Integer> path = new ArrayList<>();
    // 存储所有符合条件的组合结果
    public List<List<Integer>> ans = new ArrayList<>();
    
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 先排序,方便后续剪枝
        Arrays.sort(candidates);
        // 调用回溯函数,从索引0开始
        dfs(candidates, 0, target, 0);
        return ans;
    }
    
    public void dfs(int[] candidates, int sum, int target, int i) {
        // 当路径和等于目标值时,将当前路径加入结果集
        if (sum == target) {
            ans.add(new ArrayList<>(path));
            return;
        }
        
        // 遍历候选数组,从索引 i 开始,保证组合不重复
        for (int j = i; j < candidates.length; j++) {
            // 剪枝:如果当前元素加入后超过目标值,则终止循环
            if (sum + candidates[j] > target) {
                break;
            }
            
            // 选择当前元素
            sum += candidates[j];
            path.add(candidates[j]);
            
            // 递归调用,继续尝试选择当前元素(允许重复使用)
            dfs(candidates, sum, target, j);
            
            // 回溯:撤销当前选择,恢复 sum 和 path 状态
            path.remove(path.size() - 1);
            sum -= candidates[j];
        }
    }
}

代码详解

  1. 全局变量

    • path 用于存储当前的组合路径。

    • ans 用于存储所有满足条件的组合。

  2. 排序

    • Arrays.sort(candidates); 使数组有序,方便后续剪枝。

  3. 深度优先搜索(DFS)

    • sum 记录当前路径和。

    • i 控制遍历起点,确保组合不重复。

    • sum == target,将当前 path 加入 ans

    • 剪枝:若 sum + candidates[j] > target,提前终止循环。

    • 递归时,j 位置不变,允许重复使用当前数字。

    • 回溯时,撤销选择,保证 sum 还原。

复杂度分析

  • 时间复杂度:最坏情况下,递归树的深度为 target/min(candidates),每层最多 n 个分支,时间复杂度约为 O(n^k)

  • 空间复杂度O(k)k 为递归深度。

优化

  1. 剪枝:提前排序并在 sum + candidates[j] > target 时终止循环。

  2. 回溯优化sum 变量直接参与递归,减少重复计算。

注意

下面是一些需要特别留意的地方:

  1. 排序与剪枝:
    排序操作有助于剪枝,因为排序后如果当前路径和 sum 加上某个候选数超过了 target,可以直接终止循环,避免不必要的计算。这种优化能显著提高效率。

  2. 重复元素问题:
    虽然题目给定的是“无重复元素的数组”,但我们仍然要小心避免不同的组合产生重复结果。在回溯中通过从当前位置 i 开始递归,可以确保每个组合只出现一次。

  3. 回溯时的恢复:
    在回溯过程中,每次选择一个数字后都要撤销该选择(即 path.removesum -= candidates[j])。这一步是保证回溯算法能够正常工作的关键,因为它允许探索所有可能的路径。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车诊断开发入门以及OBD检测

一、OBD 概述 定义&#xff1a;OBD 即 On - Board Diagnostics&#xff0c;车载自动诊断系统。它能实时监测车辆各项系统和部件状态&#xff0c;以此帮助诊断故障并预警。设计初衷与发展&#xff1a;最初设计目的是控制汽车尾气排放&#xff0c;确保符合环境标准。随着技术进步…

Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读

摘要&#xff1a;重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题&#xff0c;可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…

java项目挂机自动重启操作指南

前段时间有个伙伴问我&#xff0c;java项目挂机怎么自动重启。。。。。。今天就写一个 .sh脚本来实现应用挂机的自动重启功能 #!/bin/bash # 查询mita的进程个数 countps -ef | grep mita.jar | grep -v "grep" | wc -l # echo $count nowtimedate "%Y-%m-%d %H…

Vue el-table-column内el-tooltip识别换行符 \n

结构&#xff1a; <el-table-column prop"callSummary" width"300" label"摘要"><template slot-scope"scope"><el-tooltip class"item" effect"dark" placement"top"><div v-ht…

【C++指南】一文总结C++二叉搜索树

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C二叉搜索树的实现。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给…

【报告】内镜视频图像分析Foundation Model

来源&#xff1a;医疗基础模型 仅供个人学习&#xff0c;侵权请联系我删除

使用HTML5和CSS3实现炫酷的3D立方体动画

使用HTML5和CSS3实现炫酷的3D立方体动画 项目介绍 本文将详细介绍如何使用HTML5和CSS3技术实现一个交互式3D立方体动画。这个项目不仅展示了现代Web前端技术的强大功能&#xff0c;还能帮助读者深入理解CSS3的3D变换和动画特性。 技术栈 HTML5CSS3 (transform-style, persp…

MySQL数据库和表的操作之SQL语句

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 MySQL数据库和表的操作 关系型数据库&#xff0c;都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL&#xff1a;结构化查询语言(Structured Query Language)&…

多模态大语言模型arxiv论文略读(二)

Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ➡️ 论文标题&#xff1a;Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…

全局曝光与卷帘曝光

文章目录 曝光方式优点缺点应用场景 为何全局曝光帧率比卷帘曝光方式低 卷帘曝光和全局曝光是CMOS传感器两种常见的曝光模式&#xff0c;以下是二者的对比&#xff1a; 参考&#xff1a;B站优致谱视觉 曝光方式 卷帘曝光&#xff1a;传感器的每一行像素按顺序逐行扫描曝光&…

【一起来学kubernetes】31、Helm使用详解

一、Helm 简介 Helm 是 Kubernetes 的包管理工具&#xff0c;类比 Linux 中的 yum 或 apt&#xff0c;用于简化应用的打包、部署和版本管理。其核心功能包括&#xff1a; Chart 管理&#xff1a;将 Kubernetes 资源&#xff08;Deployment、Service 等&#xff09;打包为可复…

python 常用的6个爬虫第三方库

Python中有非常多用于网络数据采集的库&#xff0c;功能非常强大&#xff0c;有的用于抓取网页&#xff0c;有的用于解析网页&#xff0c;这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一&#xff0c;可将 HTML 和 XML 文档解析为树形…

blender场景导入Unity的流程(个人总结)

处理找不到贴图的问题 blender场景导入Unity遇到的主要问题是贴图找不到。经研究是blender里材质的着色器结构不是贴图-原理化BSDF-输出导致的。目前还没有自动解决方法&#xff0c;总结了一个效率还可以的手动解决流程。 打开后到材质预览&#xff0c;看一下显示没问题&…

可编辑36页PPT | “新基建”在数字化智慧高速公路中的支撑应用方案智慧高速解决方案智慧交通方案

这份文档是一份关于“新基建”在数字化智慧高速公路中支撑应用方案的PPT内容介绍&#xff0c;它详细阐述了新基建在智慧高速建设中的背景、总体要求和建设内容。从政策背景来看&#xff0c;多个政府部门发布了相关政策文件&#xff0c;推动交通运输基础设施的数字化升级和智慧交…

一文解读DeepSeek在保险业的应用

引言 随着人工智能技术的深度渗透&#xff0c;保险行业正经历从传统经验驱动向数据智能驱动的转型。作为国产高性能开源大模型的代表&#xff0c;DeepSeek 凭借其低成本、高推理效率及跨模态处理能力&#xff0c;已成为保险机构突破服务瓶颈、重构业务逻辑的核心工具。截止目前…

物联网时代,HMI 设计的创新机遇与挑战

随着物联网&#xff08;IoT&#xff09;技术的蓬勃发展&#xff0c;各种智能设备如雨后春笋般涌现&#xff0c;从智能家居到智慧城市&#xff0c;物联网的应用场景愈发广泛。作为人与设备之间的桥梁&#xff0c;人机界面&#xff08;HMI&#xff09;设计在物联网时代扮演着至关…

【区块链安全 | 第二十四篇】单位和全局可用变量(二)

文章目录 单位和全局可用变量&#xff08;Units and Globally Available Variables&#xff09;特殊变量和函数1. 区块和交易属性2. ABI 编码和解码函数3. bytes 成员函数4. string 成员函数5. 错误处理6. 数学和加密函数7. 地址类型成员函数8. 与合约相关9. 类型信息 单位和全…

C语言:指针数组、函数、二级指针

1.指针数组 指针数组是一个数组&#xff0c;数组中的每个元素都是指针。这些指针可以指向各种类型的数据&#xff0c;如整数、字符、结构体等&#xff0c;甚至可以指向其他数组或函数。 指针数组的声明格式通常为&#xff1a; 数据类型 *数组名[数组大小];其中&#xff0c;数…

批量修改记事本文本文件编码,可以解决文本文件乱码问题

对于文本文件来说&#xff0c;通常都可以设置不同的编码格式&#xff0c;每一种不同的编码格式支持的字符都可能是不一样的。因此当编码格式出现错误的时候&#xff0c;文本文件可能会出现乱码的问题。如何将文本文件的编码由一种格式变为另外一种格式呢&#xff1f;如果文件出…

亚马逊云科技提供完全托管的DeepSeek-R1模型

近日&#xff0c;亚马逊云科技宣布在Amazon Bedrock上线完全托管的DeepSeek-R1模型。DeepSeek是首个登陆Amazon Bedrock的国产大模型&#xff0c;自今年1月底推出以来&#xff0c;已有数千客户使用Amazon Bedrock的自定义模型导入功能部署了DeepSeek-R1模型。 DeepSeek在过去几…