回溯算法 -- 216. 组合总和 III

目录

一.题目描述

二.解题思路

三.回溯三部曲

3.1确定递归函数的参数

3.2确认递归的终止条件

3.3确定单层循环逻辑

四.具体的代码


一.题目描述

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

二.解题思路

本题我们可以采用回溯算法的思想来解决这个问题

回溯算法的核心是我们要将其转换为树形结构

三.回溯三部曲

3.1确定递归函数的参数

 List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

此处我定义了一维数组path来存放符合条件的结果

定义二维数组result来存放结果集

除了这两个全局变量外,我们还需要以下参数:

targetSum(int) 目标和 对应的就是题目中给出的n。

k(int) 这个为题目中给出的k个数的集合。

sum(int) 计算已经收集的元素的总和,也就是我们上面定义的path数组里元素的。

startIndex(index) 为下一层for循环的起始位置。

3.2确认递归的终止条件

本题的终止条件由两部分组成

path数组中的元素和达到题目中给出的n

path数组的长度达到题目中给出的k

 //确定终止条件
        //目标数组长度达到k,且之和为n
        if(path.size() == k && sum == targetSum){
            result.add(new ArrayList<>(path));
            return;
        }

3.3确定单层循环逻辑

处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。

 for (int i = startIndex; i <= 9-(k-path.size())+1 ; i++) {
            //处理节点
            path.add(i);
            sum+=i;
            //递归函数
            backtracking(k,targetSum,i+1,sum);
            //回溯操作
            sum-=i;
            path.removeLast();
        }
四.具体的代码
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution216 {
    List<List<Integer>> result = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        backtracking(k,n,1,0);
        return result;
    }
    public void backtracking(int k,int targetSum,int startIndex,int sum){
        //剪枝操作
        if(sum>targetSum){
            return;
        }
        //确定终止条件
        //目标数组长度达到k,且之和为n
        if(path.size() == k && sum == targetSum){
            result.add(new ArrayList<>(path));
            return;
        }
        //确定单层循环逻辑
        for (int i = startIndex; i <= 9-(k-path.size())+1 ; i++) {
            //处理节点
            path.add(i);
            sum+=i;
            //递归函数
            backtracking(k,targetSum,i+1,sum);
            //回溯操作
            sum-=i;
            path.removeLast();
        }
    }
}

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

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

相关文章

经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)

给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1&#xff1…

【1】AI介绍

迎接 AGI 时代 AGI(Artificial General Intelligence),人工通用智能,AGI是一种可以执行复杂任务的人工智能,能够完全模仿人类智能的行为。应用领域涉及医疗、交通、智能家居等多个与人类活动密切相关的领域。 AGI 多久会到来? 乐观预测:明年(未来已来)主流预测:3-5…

【云原生】Docker Compose 使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 搭建 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版/如果不是最新可替换最新版本 3.2.2 设置权限 3.2.…

Zigbee +PC上位机 无线控制二维云台开发笔记

今日尝试开发一款简单好学的PC上位机无线控制二维云台的小试验品&#xff1a; 主要开发环境与工具介绍&#xff1a; 单片机 STM32F103C8T6 使用标准库函数编程 Visual Studio 2022软件C# Winform 开发 上位机控制软件 DL_20 无线串口模块 &#xff0b; USB-TTL 模块 实现无线通…

使用 Scapy 库编写 Ping of Death 攻击脚本

一、介绍 1.1 概述 Ping of Death&#xff08;PoD&#xff09;攻击是一种历史悠久的拒绝服务&#xff08;DoS&#xff09;攻击&#xff0c;攻击者通过发送特制的畸形ICMP Echo请求数据包&#xff0c;导致目标系统无法正确处理&#xff0c;从而导致系统崩溃、重启或无法响应正…

用于相似图片搜索引擎的Python OpenCV图像直方图

图像直方图 那么&#xff0c;图像直方图到底是什么&#xff1f; 图片 图像的构成是由像素点构成的&#xff0c;每个像素点的值代表着该点的颜色&#xff08;灰度图或者彩色图&#xff09;。所谓直方图就是对图像的中的这些像素点的值进行统计&#xff0c;得到一个统一的整体的…

手眼标定学习笔记

目录 标定代码&#xff1a; 手眼标定原理学习 什么是手眼标定 手眼标定的目的 eye in hand eye to hand AXXB问题的求解 标定代码&#xff1a; GitHub - pumpkin-ws/HandEyeCalib 推荐博文&#xff1a; https://zhuanlan.zhihu.com/p/486592374 手眼标定原理学习 参…

YOLOv8: 标注石头、识别边缘及计算面积的方案

YOLOv8: 标注石头、识别边缘及计算面积的方案 引言 YOLO&#xff08;You Only Look Once&#xff09;是一种非常有效的实时目标检测算法&#xff0c;自其首次发布以来就受到了广泛的关注和应用。YOLOv8 是这一系列算法的最新版本&#xff0c;继承了之前版本的高效性和准确性&a…

如何在一台电脑上安装多个版本的JDK并且切换使用?

如何在一台电脑上安装多个版本的JDK并且切换使用&#xff1f; 文章目录 如何在一台电脑上安装多个版本的JDK并且切换使用&#xff1f;1.目录管理2.下载JDK3.配置环境变量4. 验证 1.目录管理 我们需要首先对不同版本的JDK进行版本管理&#xff0c;如下所示&#xff0c;我在C盘路…

vue3状态管理,pinia的使用

状态管理 我们知道组件与组件之间可以传递信息&#xff0c;那么我们就可以将一个信息作为组件的独立状态&#xff08;例如&#xff0c;单个组件的颜色&#xff09;或者共有状态&#xff08;例如&#xff0c;多个组件是否显示&#xff09;在组件之传递&#xff0c;这样的话我们希…

STM32作业实现(七)OLED显示数据

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

最新h5st(4.7.2)参数分析与纯算法还原(含算法源码)

文章目录 1. 写在前面2. 加密分析3. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

HALCON-从入门到入门-最常用的算子-二值化

1.废话 图像处理中的二值化是一种将灰度图像转换为只有两种可能值&#xff08;通常是0和255&#xff0c;分别代表黑色和白色&#xff09;的过程。这个过程在数字图像处理中非常常见&#xff0c;因为它可以简化图像数据&#xff0c;突出图像的主要特征&#xff0c;并降低后续处…

5.25.12 数字组织病理学的自我监督对比学习

无监督学习可以弥补标记数据集的稀缺性。 无监督学习的一个有前途的子类是自监督学习&#xff0c;其目的是使用原始输入作为学习信号来学习显著特征。在这项工作中&#xff0c;我们解决了在没有任何监督的情况下学习领域特定特征的问题&#xff0c;以提高数字组织病理学界感兴…

【vue实战项目】通用管理系统:作业列表

目录 目录 1.前言 2.后端API 3.前端API 4.组件 5.分页 6.封装组件 1.前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog…

【Linux】Linux工具——gcc/g++

1.使用vim更改信用名单——sudo 我们这里来补充sudo的相关知识——添加信任白名单用户 使用sudo就必须将使用sudo的那个账号添加到信用名单里&#xff0c;而且啊&#xff0c;只有超级管理员才可以添加 信用名单在/etc/sudoers里 我们发现它的权限只是可读啊&#xff0c;所以…

MD中 面料的物理属性参数

该图片是Marvelous Designer软件中"Fabric Physical Properties"(面料物理属性)面板的截图,用于调整面料在弯曲、折叠时的硬度(Buckling Stiffness)。 目标部分解释了调整Buckling Stiffness的作用:通过调整该百分比值来决定面料角落处的硬度。进入80%的Buckling St…

Linux网络编程:应用层协议|HTTPS

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

java调用科大讯飞离线语音合成SDK --内附完整项目

科大讯飞语音开放平台基础环境搭建 1.用户注册 注册科大讯飞开放平台账号 2.注册好后先创建一个自己的应用 创建完成后进入应用选择离线语音合成&#xff08;普通版&#xff09;可以看到我们开发需要的SDK,选择windows MSC点击下载。 3.选择你刚刚创建的应用&#xff0c;选择…

python安装pystan教程

简介 PyStan是Stan编程语言的Python接口&#xff0c;Stan是一种用于统计建模和数据分析的概率编程语言。PyStan使用户能够在Python环境中定义、编译和采样Stan模型。 安装步骤 首先&#xff0c;需要先安装 Cython pip install Cython -i https://mirrors.aliyun.com/pypi/sim…