回溯算法02-组合总合III(Java)

2.组合总合III

  • 题目描述

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

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

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

示例 1:

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

动态规划与回溯算法

刚读题目的大家可能会想到可以通过动态规划的0-1背包去解决这道题目,但是我们发现本题目的输出结果是集合的形式,如果用动态规划可能会导致存储结构复杂,所以我们可采用回溯算法去解决这道题目

回溯算法的思路

回溯算法是一种通过不断地尝试可能的解决方案来解决问题的方法。在解决问题时,我们尝试每一种可能的选择,当发现该选择并不符合要求时,则取消该选择,回溯到上一步,进行其他选择。下面是该算法的题解步骤:1.创建一个 LinkedList path 用于存储当前的组合路径,创建一个 List result 用于存储最终结果。2.在 backtrack 方法中,首先判断是否满足终止条件,即当前路径的数字和等于 n 且路径长度为 k,如果满足则将当前路径加入结果集中;
在单层遍历逻辑中,从 startIndex 开始遍历到 9,这是因为剩余未遍历的数字数量要大于等于 k - path.size()3.在遍历过程中,依次将数字加入路径中,并更新当前数字和 sum;然后递归调用 backtrack 方法,继续向下搜索;搜索完成后进行回溯操作,将当前数字移出路径,恢复 sum 的值。

举例如下图

image-20240306160921321

  • Java代码实现
LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtrack(n, k, 1, 0);return result;}private void backtrack(int n, int k, int startIndex, int sum) {if (path.size() == k && sum == n) {result.add(new LinkedList<>(path));return;}for (int i = startIndex; i <= 9; i++) {if (sum >= n) return;sum += i;path.add(i);backtrack(n, k ,i + 1, sum);path.removeLast();sum -= i;}}
  • 剪枝操作
为例提高代码运行的效率,我们可以进行一下剪枝操作:
1.当path的长度达到3时如果没有满足sum的条件则可以返回
2.当sum>t时说明已经超过要求解的范围,所以也可以直接返回
3.条件中要求满足path中要有k个数,但遍历的元素加上已有的path中的元素不足k时,则可以直接结束循环
path中的元素个数:path.size()
除了path中的元素还需要从i遍历到9剩余的元素个数:(9 - i + 1)
因此(9 - i + 1) + path.size() >= k
所以i要满足:10 + path.size() - k >= i最终剪枝后的代码    
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new LinkedList<>();public List<List<Integer>> combinationSum3(int k, int n) {backtrack(k, n, 1, 0);return result;}private void backtrack(int k, int n, int startIndex, int sum) {//终止条件if (n == sum && path.size() == k) {//收集结果result.add(new ArrayList<>(path));return;} else if (path.size() == k) {return;} else if (sum > n) {return;}//单层遍历的逻辑for (int i = startIndex; i <= 10 + path.size() - k; i++) {path.add(i);sum += i;backtrack(k, n, i + 1, sum);//递归sum -= i;//回溯path.removeLast();}}
}
  • 代码中的小细节

为什么在result.add(new ArrayList<>(path));要new一个新的集合?

在代码中,new LinkedList<>(path)这行代码用于创建一个新的LinkedList对象,该对象包含与现有path列表相同的元素。这么做的原因是为了避免直接将path列表添加到result结果列表中,因为在回溯过程中path列表会不断地被修改,直接添加到result中可能会导致结果出错。因此,需要创建一个新的LinkedList对象来保存path的当前状态,以便在回溯过程中正确地记录和保存组合的情况。path是全局变量会变化的

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

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

相关文章

[Linux]如何理解kernel、shell、bash

文章目录 概念总览kernelshell&bash 概念总览 内核(kernel) &#xff0c;外壳(shell) &#xff0c;bash kernel kernel是指操作系统中的核心部分&#xff0c;用户一般是不能直接使用kernel的。它主要负责管理硬件资源和提供系统服务&#xff0c;如内存管理、进程管理、文件…

Pytest测试技巧之Fixture:模块化管理测试数据!

在 Pytest 测试中&#xff0c;有效管理测试数据是提高测试质量和可维护性的关键。本文将深入探讨 Pytest 中的 Fixture&#xff0c;特别是如何利用 Fixture 实现测试数据的模块化管理&#xff0c;以提高测试用例的清晰度和可复用性。 什么是Fixture&#xff1f; 在 Pytest 中…

【考研数学】武忠祥各阶段用书搭配+学习包

25考研数学全流程规划&#xff01;别等到二战了才知道这样学 本人属于基础很差相当于是零基础的考研党&#xff0c;经过一年备考成功上岸 中间花费了很多时间在考研数学备考信息检索上&#xff0c;写下这篇希望能帮助基础不好的学弟学妹们多节约一些时间复习&#xff01; 25…

【PowerMockito:编写单元测试过程中原方法没有注入的属性在跑单元测试时出现空指针】

出错场景 下面这一步报空指针&#xff0c;但是因为没有注入&#xff0c;在测试类中无法使用Mock 解决 在执行方法前&#xff0c;加入以下代码 MemberModifier.field(ResourceServiceImpl.class,"zero").set(resourceService,"0");

网页打开慢,这锅该谁背?

一、背景 工作中扯皮说不可避免且非常常见的事情. 开发与产品、开发和测试、前端和后端都会产生扯皮现象。今天要聊的一个问题就是前后端之间的扯皮问题。 网页打开太慢或者点击了某个按钮发现数据很久才显示出来&#xff0c;这个锅谁背? 做开发不能无凭据地胡乱甩锅, 我们…

电子电气架构——汽车以太网诊断路由汇总

电子电气架构——汽车以太网诊断路由汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将…

python 蓝桥杯填空题

文章目录 字母数判断列名&#xff08;进制问题&#xff09;特殊日期大乘积星期几 字母数 由于是填空题&#xff0c;那么寻找的话&#xff0c;就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名&#xff08;进制问题&#xff09; 这道题目&#xff0c;我们可…

视频号带货究竟怎么做?老阳分享的项目怎么样?

在当今社会&#xff0c;随着互联网的快速发展&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。在这个背景下&#xff0c;视频号带货作为一种新兴的电商模式&#xff0c;逐渐崭露头角。许多人都想通过加入视频号带货行业来实现自己的财富自由。其中&#xff0c;老…

SPSS Statistics for Mac/Win:让数据说话,为决策赋能

在数字化时代&#xff0c;数据已成为决策的关键。为了从海量数据中提取有价值的信息&#xff0c;专业的统计分析软件不可或缺。IBM SPSS Statistics就是这样一款强大的工具&#xff0c;无论是Windows还是Mac用户&#xff0c;都能通过它轻松实现数据分析和决策支持。 一、SPSS …

从0到1入门C++编程——09 STL、string容器、vector容器、deque容器

文章目录 一、标准模板库STL二、容器算法迭代器应用1、遍历容器中整型数据2、遍历容器中自定义数据类型3、容器中嵌套容器 三、string容器1、构造函数2、赋值操作3、字符串拼接4、查找和替换5、字符串比较6、字符访问与存取7、插入和删除8、子串 四、vector容器1、构造函数2、赋…

游戏力:竞技游戏设计实战教程

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 游戏力&#xff1a;竞技游戏设计实战教程 引言…

GBU3010-ASEMI火牛适配器专用整流桥GBU3010

编辑&#xff1a;ll GBU3010-ASEMI火牛适配器专用整流桥GBU3010 型号&#xff1a;GBU3010 品牌&#xff1a;ASEMI 封装&#xff1a;GBU-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;30A 功率(Pd)&#xff1a;大功率 芯片个数&…

前端运算符比较与计算中的类型转换,运算规则

题目&#xff1a; 下面表达式的值分别都是什么&#xff08;类型转换&#xff09; 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值&#xff0c;没有函数可以调用的。…

【C++】二叉树进阶面试题(下)

目录 6. 根据一棵树的前序遍历与中序遍历构造二叉树 题目 分析 代码 7. 根据一棵树的中序遍历与后序遍历构造二叉树 题目 分析 代码 8. 二叉树的前序遍历&#xff0c;非递归迭代实现 题目 分析 代码 9. 二叉树中序遍历 &#xff0c;非递归迭代实现 题目 分析 …

RLNNA-DBSCAN聚类

RLNNA-DBSCAN聚类 RLNNA算法&#xff08;基于强化学习的神经网络优化算法&#xff09;是一种性能较佳的优化算法。DBSCAN聚类算法&#xff08;密度聚类算法&#xff09;是一种基于密度的聚类算法&#xff0c;其主要思想是通过寻找样本点周围的密度可达关系来聚类数据。 使用RL…

自动化专家来谈谈Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

小白如何选择阿里云服务器配置?小白不怕

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

事件流、事件捕获、事件冒泡、事件委托

一、事件流 事件流指的是事件完整执行过程中的流动路径&#xff0c;分为捕获阶段、冒泡阶段。如上图 二、事件捕获 当一个元素的事件被触发时&#xff0c;会从DOM的根元素开始&#xff0c;依次调用同名事件&#xff08;从外到里&#xff0c;从父到子&#xff09;。 DOM.addEve…

基于炬芯ATS283X头戴式蓝牙耳机开发

基于炬芯ATS283X头戴式蓝牙耳机开发 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加他微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,DSP音频项目核心开发资料, 1 电路设计 2 SDK 开发

CryoEM - CryoAI: Amortized Inference of Poses 工程源码复现

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 Paper: CryoAI: Amortized Inference of Poses for Ab Initio Reconstruction of 3D Molecular Volumes from Real Cryo-EM Images CryoAI: 基于摊…