回溯算法01-组合(Java)

1.组合

  • 题目描述

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]
  • 题目分析
根据题目可知,本题是求1-n这n个不同的数的组合问题,我们知道对于n个不同的数中的任意k个数组合,当n很大时通过枚举是很难将它枚举完成的,所以我们可以采用回溯算法来解决这一类问题。
  • 回溯算法的模板

1.确立递归函数及返回值

2.确立回溯的终止条件

3.单层递归逻辑

private void backtracking(参数) {//回溯的终止条件if (终止条件) {存放结果;return;}//回溯算法的遍历过程(集合的大小为树的宽度,递归的深度为树的深度)for (选择 :本层集合的元素) {处理节点;backtracking(路径, 选择列表);//递归回溯,撤销处理的结果}
}
1.首先我们确立递归函数及参数(例子:nums=[1,2,3] k = 2)
根据下图递归操作我们可以看出,每次挑选数组nums中的一个元素加入到集合之中:
第一次:集合元素为[1],剩余元素为[2,3]
第二次:集合元素为[1,2],剩余元素为[3] 此时集合[1,2]满足k = 2的组合条件,将其存储,因为之后不再再取3会使不满足k个数组合的条件,因此要进行回溯,返回到集合元素为[1],剩余元素为[2,3]
第三次:集合元素为[1,3],剩余元素为[] 此时要选择元素3加入到集合,因此我们要设置一个索引来避开元素2,这样才不会有重复
...依次回溯,我们发现每次叶子节点为我们想要的结果所以初始化一个回溯函数
void backtrack(int nums[], int startIndex) {}
nums为要组合的元素集合,startIndex为避免每次重复的指针2.设置终止条件:当我们组合的集合中恰好有k个节点时,表示组合完成3.单层递归逻辑
从startIndex开始,遍历所有可能的元素,将其添加到路径中,并递归调用backtrace方法继续生成下一个元素。完成递归后,需要将最后一个元素从路径中移除,以便尝试其他可能的元素。

image-20240305194217384

  • 以nums=[1,2,3,4] k = 2直观感受一下i与startIndex的变化
i = 1 s = 1 [1]
i = 2 s = 2 [1,2]
//i = 2 s = 2 [1]
i = 3 s = 2 [1,3]
//i = 3 s = 2 [1] 
i = 4 s = 2 [1,4]
//i = 4 s = 2 [1]
i = 2 s = 1 [2]
i = 3 s = 3 [2,3]
//i = 3 s = 3 [2]
i = 4 s = 3 [2,4]
//i = 4 s = 3 [2]
i = 3 s = 1 [3]
...
  • Java代码实现
//list:用于存储一条路径上的元素//result:用于返回最后的元素LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {backtrace(n, k, 1);return result;}//1.确立递归函数的参数及返回值//n:树的宽度即求n个数的组合数//k:叶子节点即组合个数为k//startIndex:用于开始元素遍历的起点private void backtrace(int n, int k, int startIndex) {//2.确立终止条件if (path.size() == k) {//当最后组成的元素集合为k时返回结果result.add(new LinkedList<>(path));return;}//3.单层递归逻辑for (int i = startIndex; i <= n; i++) {path.add(i);backtrace(n, k, i + 1);path.removeLast();}}

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

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

相关文章

java 面试题总结

1锁粗化和锁消除&#xff0c;锁膨胀和锁升级的区别。 https://www.cnblogs.com/xuxinstyle/p/13387778.html .无锁 < 偏向锁 < 轻量级锁 < 重量级锁 &#xff0c;说的时候不要忘记说无锁状态 2.Map 的实现&#xff0c;线程安全的实现 1、ConcurrentHashMap在JDK 1.7…

CSS元素分类,轻松拿下offer

戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】 面试题 HTML 1&#xff0c;html5有哪些新特性&#xff1f; 2&#xff0c;html5移除了那些元素&#xff1f; 3&#xff0c;如何处理HTML5新标签的浏览器兼容问题…

图片中不想展现的人怎么去除?这三个方法一键去除

在旅游的过程中&#xff0c;我们总是希望能够捕捉到最美丽的风景和最有意义的瞬间。但是&#xff0c;有时拍出来的照片中却会出现一些不必要的人物&#xff0c;影响了整个照片的美观度。这时&#xff0c;我们怎么办呢&#xff1f;今天&#xff0c;就来教大家怎么把图片中不想要…

[Flutter get_cli] 配置 sub_folder:false报错

flutter get_cli 配置 get_cli:sub_folder:false报错如下 Because getx_cli_learn01 depends on get_cli from unknown source "sub_folder", version solving failed. 原因是在 pubspec.yaml文件中, get_cli:sub_folder:false要和 dependencies: xxx dev_depe…

【STM32F103】WDG看门狗

本系列在之前介绍时钟树的文章中有稍微提一下看门狗WDG&#xff08;Watch Door Dog&#xff09;。 简单来说&#xff0c;可以当成是一个计数器&#xff0c;一旦这个计数器溢出则单片机复位。因为我们需要每隔一段时间就把这个计数器的值清零&#xff08;喂狗&#xff09;。 I…

HTTP协议与HTTPS协议

HTTP协议 HTTP协议是一个无状态的协议&#xff0c; 服务器不维护任何有关客户端之前所发请求的消息。 是一种懒政&#xff0c;有状态协议就会更加复杂&#xff0c;需要维护状态&#xff08;历史信息&#xff09;,要是客户或者服务器失效,会产生状态不一致(状态前后不对称),解决…

C++ string类详解及模拟实现

目录 【本节目标】 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 面试题(暂不做讲解) 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明&#xff08;注意下面我只讲解最常用的接口&#xff09; 3. string类的模拟实现 3.1string类常用…

14:Hadoop数据分析|节点管理|搭建NFS网关服务

数据分析&#xff5c;节点管理&#xff5c;搭建NFS网关服务 HDFS文件系统的使用调用Hadoop集群分析数据Hadoop集群的维护增加修复节点删除节点 搭建NFS网关服务创建账户并授权在nfsgw上运行网关服务NFSGW测试 HDFS文件系统的使用 访问文件系统的两种方式&#xff1a; web页面…

基于Springboot的足球俱乐部管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的足球俱乐部管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍: 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff…

简单介绍AudioLM

主要介绍AudioLM&#xff0c;学习资料为知乎文章。这里只介绍核心思想和模块。 AudioLM 基本信息 AudioLM: a Language Modeling Approach to Audio Generation pdf: https://arxiv.org/pdf/2209.03143.pdf 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/637196330 模…

2024年第一届CS2major,新胶囊即将发行,需要提前做哪些布局

2024年第一届CS2major&#xff0c;将会在3月17日哥本哈根开始。 所以&#xff1a; 1、新的胶囊大概率会在3月10日左右发布。 2、网传战队挂坠&#xff0c;不知道是否会出现&#xff1f;&#xff08;原本出现过战队布章包&#xff0c;由于销量太差&#xff0c;第二届就取消了…

C++多态详解

文章目录 多态概念定义及实现构成条件虚函数虚函数的重写override 和 final重载、覆盖、隐藏 抽象类纯虚函数接口继承与实现继承 多态的原理虚函数表原理动态绑定与静态绑定 多继承的虚函数表多继承中的虚函数表 多态 概念 多态是面向对象三大特性中相对复杂的一个&#xff0…