LeetCode 216.组合总和 III:回溯算法实现与剪枝优化

news2025/5/11 17:59:48

目录

  1. 问题描述
  2. 解决思路
    • 回溯法
    • 剪枝优化
  3. 代码实现
  4. 复杂度分析
  5. 示例测试
  6. 总结与扩展

1. 问题描述

给定两个整数 kn,要求找出所有满足以下条件的组合:

  • 组合包含 k 个不同的数字
  • 组合中数字的和等于 n
  • 组合中的数字范围为 [1, 9],且每个数字只能使用一次。

示例:

  • 输入:k = 3, n = 7
  • 输出:[[1, 2, 4]]
  • 解释:1 + 2 + 4 = 7,且没有其他满足条件的三元组。

2. 解决思路

2.1 回溯法

回溯法是解决组合问题的经典方法。其核心思想是:

  1. 递归生成候选解:从候选数字中逐个尝试添加元素。
  2. 剪枝:当发现当前路径无法生成有效解时,提前终止递归。
  3. 回溯撤销选择:在递归返回后,撤销最后一步选择,尝试其他可能性。

2.2 剪枝优化

为了提升算法效率,需要设计剪枝条件:

  1. 总和超过目标值:若当前路径的和已超过 n,停止递归。
  2. 剩余数字不足:若剩余可选的数字不足以填满组合的剩余位置,停止递归。
  3. 避免重复组合:按升序选择数字,确保组合唯一。例如,选择 [1, 2, 4] 后不会生成 [2, 1, 4]

3. 代码实现

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(result, new ArrayList<>(), 1, k, n, 0);
        return result;
    }

    private void backtrack(
        List<List<Integer>> result,
        List<Integer> path,
        int start,
        int k,
        int n,
        int currentSum
    ) {
        // 终止条件:路径长度等于k
        if (path.size() == k) {
            if (currentSum == n) {
                result.add(new ArrayList<>(path));
            }
            return;
        }

        // 计算当前可以选择的数字的最大起始值
        int remaining = k - path.size();
        int maxPossible = 10 - remaining; // 确保剩余数字足够填充剩余位置
        maxPossible = Math.min(maxPossible, 9); // 不超过9

        for (int i = start; i <= maxPossible; i++) {
            // 剪枝:总和超过n时提前终止
            if (currentSum + i > n) break;

            path.add(i);
            backtrack(result, path, i + 1, k, n, currentSum + i); // 递归下一层
            path.remove(path.size() - 1); // 回溯撤销选择
        }
    }
}

关键代码解释

  • backtrack 方法参数

    • result:存储所有合法组合的结果集。
    • path:当前递归路径上的数字组合。
    • start:当前可选的起始数字(避免重复)。
    • k, n:题目输入的条件。
    • currentSum:当前路径的数字和。
  • 剪枝条件

    • maxPossible = 10 - remaining:确保剩余的数字足够填充组合的剩余位置。例如,若还需选2个数字,则起始数字最大为 8(因为 8, 9 是最后两个可选数字)。

4. 复杂度分析

  • 时间复杂度:最坏情况下需要遍历所有组合,时间复杂度为 O(C(9, k)),即从9个数字中选k个的组合数。
  • 空间复杂度:递归调用栈深度为 k,空间复杂度为 O(k)

5. 示例测试

示例 1

输入:k = 3, n = 7
输出:[[1, 2, 4]]

示例 2

输入:k = 4, n = 1
输出:[]
解释:无法找到4个不同的数且和为1

6. 总结与扩展

  • 回溯法的适用性:适合解决组合、排列、子集等问题,通过递归和剪枝平衡效率。
  • 剪枝优化的重要性:合理剪枝可以显著减少无效递归路径。
  • 扩展问题
    • 组合总和 I(数字可重复使用)
    • 组合总和 II(包含重复数字但不可重复使用)

核心收获:通过升序选择数字避免重复,通过预计算最大起始值减少无效遍历。

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

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

相关文章

住宅 IP 地址:数字时代的真实网络身份载体

在互联网的底层架构中&#xff0c;IP 地址是设备连接网络的 “数字身份证”。而住宅 IP 地址作为其中最贴近真实用户的类型&#xff0c;特指互联网服务提供商&#xff08;ISP&#xff09;分配给家庭或个人用户的 IP 地址&#xff0c;具有以下核心特征&#xff1a; 物理关联性 …

[SSM]-Spring介绍

框架是什么 框架 framework 建筑学: 用于承载一个系统必要功能的基础要素的集合计算机: 某特定领域系统的一组约定, 标准, 代码库以及工具的集合 框架vs工具 框架作为项目的骨架合基础结构, 提供了高层次的抽象和可复用性工具作为辅助手段, 帮助开发者完成特定任务并提高工作…

今天的python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 晚上8点到的&#xff0c;还是会被感动到&#xff0c;有一位列车员同志在检票期间&#xff0c;叫我到列车员专座位上去坐&#xff0c;我很感激他&#xff0c;温暖人心&#xff0c;所以人间填我…

Mysql进阶篇1_存储引擎、索引、SQL性能分析指令

文章目录 1.存储引擎InnoDBMyISAMMemory存储引擎选择和对比 2.索引索引结构索引分类索引语法索引使用&#xff08;建议看完第3节后观看&#xff09;&#xff01;&#xff01;&#xff01;mysql如何使用索引查询数据&#xff08;个人理解&#xff09; 3.SQL性能分析SQL执行频率慢…

协议(消息)生成

目录 协议(消息)生成主要做什么? 知识点二 制作功能前的准备工作 ​编辑​编辑 制作消息生成功能 实现效果 ​总结 上一篇中配置的XML文件可见&#xff1a; https://mpbeta.csdn.net/mp_blog/creation/editor/147647176 协议(消息)生成主要做什么? //协议生成 主要是…

Linux 系统的指令详解介绍

Linux 系统的指令详解介绍 一、指令的本质与定义1. 什么是指令?2. Linux 指令分类二、指令格式解析1. 基础语法结构2. 语法要素详解(1)选项类型(2)参数类型三、核心指令分类1. 文件操作指令2. 文本处理指令3. 系统管理指令一、指令的本质与定义 1. 什么是指令? 定义:在…

Milvus(17):向量索引、FLAT、IVF_FLAT

1 索引向量字段 利用存储在索引文件中的元数据&#xff0c;Milvus 以专门的结构组织数据&#xff0c;便于在搜索或查询过程中快速检索所需的信息。 Milvus 提供多种索引类型和指标&#xff0c;可对字段值进行排序&#xff0c;以实现高效的相似性搜索。下表列出了不同向量字段类…

芯片笔记 - 手册参数注释

芯片手册参数注释 基础参数外围设备USB OTG&#xff08;On-The-Go&#xff09;以太网存储卡&#xff08;SD&#xff09;SDIO 3.0(Secure Digital Input/Output)GPIO&#xff08;General Purpose Input/Output 通用输入/输出接口&#xff09;ADC&#xff08;Analog to Digital C…

RabbitMQ学习(第二天)

文章目录 1、生产者可靠性①、生产者重连②、生产者确认 2、MQ可靠性①、数据持久化②、LazyQueue(惰性队列) 3、消费者可靠性①、消费者确认②、失败重试机制③、保证业务幂等性 总结 之前的学习中&#xff0c;熟悉了java中搭建和操作RabbitMQ发送接收消息&#xff0c;熟悉使用…

【JS逆向基础】爬虫核心模块:request模块与包的概念

前言&#xff1a;这篇文章主要介绍JS逆向爬虫中最常用的request模块&#xff0c;然后引出一系列的模块的概念&#xff0c;当然Python中其他比较常用的还有很多模块&#xff0c;正是这些模块也可以称之为库的东西构成了Python强大的生态&#xff0c;使其几乎可以实现任何功能。下…

LabVIEW燃气轮机测控系统

在能源需求不断增长以及生态环境保护备受重视的背景下&#xff0c;微型燃气轮机凭借其在经济性、可靠性、维护性及排放性等方面的显著优势&#xff0c;在航空航天、分布式发电等众多领域得到广泛应用。随着计算机技术的快速发展&#xff0c;虚拟仪器应运而生&#xff0c;LabVIE…

QT | 常用控件

前言 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 —…

LLM论文笔记 28: Universal length generalization with Turing Programs

Arxiv日期&#xff1a;2024.10.4机构&#xff1a;Harvard University 关键词 图灵机 CoT 长度泛化 核心结论 Turing Programs 的提出 提出 Turing Programs&#xff0c;一种基于图灵机计算步骤的通用 CoT 策略。通过将算法任务分解为逐步的“磁带更新”&#xff08;类似图灵…

AI日报 · 2025年5月07日|谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本),大幅提升编码与视频理解能力

1、谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;大幅提升编码与视频理解能力 谷歌于5月6日提前发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;为开发者带来更强编码能力&#xff0c;尤其优化了前端与UI开发、代码转换及智能体工作流构建&#xff0c;并在WebDe…

指定Docker镜像源,使用阿里云加速异常解决

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo异常贴图 yum-config-manager&#xff1a;找不到命令 因为系统默认没有安装这个命令&#xff0c;这个命令在yum-utils 包里&#xff0c;可以通过命令yum -y install yum-util…

VITA STANDARDS LIST,VITA 标准清单下载

VITA STANDARDS LIST&#xff0c;VITA 标准清单下载 DesignationTitleAbstractStatusVMEbus Handbook, 4th EditionA users guide to the VME, VME64 and VME64x bus specifications - features over 70 product photos and over 160 circuit diagrams, tables and graphs. The…

Python从入门到高手8.3节-元组的常用操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 祈祷明天不再打雷下雨 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;着重介绍元组类型的操作方法。 ​ 元组是…

Linux系统安装PaddleDetection

一、安装cuda 1. 查看设备 先输入nvidia-smi&#xff0c;查看设备支持的最大cuda版本&#xff0c;选择官网中支持的cuda版本 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/conda/linux-conda.html 2. 下载CUDA并安装 使用快捷键…

【漫话机器学习系列】239.训练错误率(Training Error Rate)

机器学习基础概念 | 训练错误率&#xff08;Training Error Rate&#xff09;详解 在机器学习模型训练过程中&#xff0c;评估模型性能是至关重要的一个环节。其中&#xff0c;训练错误率&#xff08;Training Error Rate&#xff09; 是最基础也最重要的性能指标之一。 本文将…

OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…