当前位置: 首页 > news >正文

回溯算法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();}}

相关文章:

回溯算法01-组合(Java)

1.组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]示例 2&#xff1a; 输入&#x…...

初始网络 --- 网络基础

目录 0、 前言 1、 计算机网络发展背景 1.1. 局域网(LAN) && 广域网(WAN) 2、 认识并理解协议 3、 初始网络协议 3.1. 协议分层 4、 TCP/IP 五层(或四层)模型 4.1. 简单了解TCP/IP层状体系 4.2. TCP/IP协议层状结构和计算机层状结构的关系 5、 OSI七层模型 …...

在Linux/Ubuntu/Debian中计算MD5,SHA256的方法

MD5&#xff08;消息摘要算法 5&#xff09;和 SHA-256&#xff08;安全哈希算法 256 位&#xff09;等流行的哈希算法广泛用于从任意数据生成固定大小的哈希值或校验和。 以下是这些算法及其计算方式的简要概述&#xff1a; MD5&#xff08;消息摘要算法5&#xff09;&#x…...

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…...

批次大小对ES写入性能影响初探

问题背景 ES使用bulk写入时每批次的大小对性能有什么影响&#xff1f;设置每批次多大为好&#xff1f; 一般来说&#xff0c;在Elasticsearch中&#xff0c;使用bulk API进行批量写入时&#xff0c;每批次的大小对性能有着显著的影响。具体来说&#xff0c;当批量请求的大小增…...

c语言十大核心用法

当然&#xff0c;以下是十个关于 C 语言用法的代码示例&#xff1a; 指针的基本用法&#xff1a; #include <stdio.h>int main() {int num 10;int *ptr;ptr &num;printf("The value of num is: %d\n", *ptr);return 0; }结构体的使用&#xff1a; #in…...

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

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

题目 1538: 蓝桥杯-格子位置

题目描述: 输入三个自然数N&#xff0c;i&#xff0c;j &#xff08;1< i< N&#xff0c;1< j< N&#xff09;&#xff0c;输出在一个N*N格的棋盘中&#xff0c;与格子&#xff08;i&#xff0c;j&#xff09;同行、同列、同一对角线的所有格子的位置。 样例解释…...

第十三届蓝桥杯嵌入式省赛程序设计详细题解

第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单&#xff0c;没有那么多串口的数据处理以及判断&#xff01; 第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中&#xff0c;我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LC…...

Go 语言指针

1. 什么是指针&#xff1f; 在 Go 语言中&#xff0c;指针是一种特殊的数据类型&#xff0c;它存储了一个变量的内存地址。指针提供了直接访问和修改变量值的能力。 2. 指针的基本操作 2.1 声明指针 在 Go 中声明指针需要使用 * 符号&#xff0c;例如&#xff1a; var p *…...

指针运算笔试题解析

题目1&#xff1a; int main() { int a[5] { 1, 2, 3, 4, 5 }; int* ptr (int*)(&a 1); printf("%d %d", *(a 1), *(ptr - 1)); return 0; } ptr中存放了整个数组的地址&#xff0c;ptr是int*类型&#xff0c;&a1跳到5的地址后又被强制类…...

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…...

Tensorflow2.0笔记 - 常见激活函数sigmoid,tanh和relu

本笔记主要记录常见的三个激活函数sigmoid&#xff0c;tanh和relu&#xff0c;关于激活函数详细的描述&#xff0c;可以参考这里&#xff1a; 详解激活函数&#xff08;Sigmoid/Tanh/ReLU/Leaky ReLu等&#xff09; - 知乎 import tensorflow as tf import numpy as nptf.__ve…...

1688商品详情数据采集,工程数据采集丨店铺数据采集丨商品详情数据采集

1688是中国的一个大型B2B电子商务平台&#xff0c;主要用于批发和采购各种商品。对于需要从1688上获取商品详情数据、工程数据或店铺数据的用户来说&#xff0c;可以采用以下几种常见的方法&#xff1a; 官方API接口&#xff1a;如果1688提供了官方的API接口&#xff0c;那么可…...

Flutter(四):SingleChildScrollView、GridView

SingleChildScrollView、GridView 遇到的问题 以下代码会报错: class GridViewPage extends StatefulWidget {const GridViewPage({super.key});overrideState<GridViewPage> createState() > _GridViewPage(); }class _GridViewPage extends State<GridViewPage&g…...

【C++】102.二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1…...

Java学习笔记006——子类与父类的类型转换

在Java中&#xff0c;类型转换主要涉及到两种类型&#xff1a;向上类型转换&#xff08;Upcasting&#xff09;和向下类型转换&#xff08;Downcasting&#xff09;。 1. 向上类型转换&#xff08;Upcasting&#xff09;&#xff1a; 向上类型转换是将子类的对象转换为父类类…...

FedAsync Asynchronous Federated Optimization

文章目录 IntroductionMethodologyConvergence analysisExperiments Introduction 联邦学习有三个关键属性: 不频繁的任务激活。对于弱边缘设备&#xff0c;学习任务只在设备空闲、充电、连接非计量网络时执行.沟通不频繁。边缘设备和远程服务器之间的连接可能经常不可用、缓…...

学习基于 JavaScript 语言 的计算机界三大神书”之一 ——SICP

如何阅读“计算机界三大神书”之一 ——SICP 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

水培种菜翻车了?可能是水质问题!用NodeMCU和TDS传感器给你的营养液做个“体检”

水培种菜翻车了&#xff1f;可能是水质问题&#xff01;用NodeMCU和TDS传感器给你的营养液做个“体检” 看着阳台上蔫头耷脑的生菜叶子&#xff0c;你开始怀疑人生——明明按照教程配了营养液&#xff0c;定时补光通风&#xff0c;为什么植物就是长不好&#xff1f;别急着怪自己…...

EPLAN端子图表修改避坑指南:从占位符到动态区域,手把手教你定制专属端子连接图

EPLAN端子图表深度定制指南&#xff1a;从占位符优化到动态布局实战 在电气工程设计领域&#xff0c;EPLAN作为行业标杆软件&#xff0c;其端子图表功能直接影响项目交付的专业度和效率。许多工程师在项目后期常遇到这样的困境&#xff1a;标准端子图表无法满足客户特殊规范要求…...

【无人机协同】联合优化无人机轨迹、发射功率与地面用户-MEC关联的多无人机多地面用户系统 附matlab代码✅

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e;完整代码获取 定制创新 论文复现点击&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量m…...

从A/B测试到临床实验:避开P值陷阱的5个实战要点(含单尾/双尾选择指南)

从A/B测试到临床实验&#xff1a;避开P值陷阱的5个实战要点&#xff08;含单尾/双尾选择指南&#xff09; 在数据驱动的决策时代&#xff0c;P值已成为产品迭代和医学研究中的"通行货币"。当A/B测试报告显示"P<0.05"时&#xff0c;团队往往迫不及待地全…...

TVBox 最新版本 | 接口持续更新 | 追剧稳定不失效

分享一个自用很久、一直在持续维护更新的 TVBox 版本&#xff0c;主打稳定、流畅、长期可用&#xff0c;接口会定期更新&#xff0c;避免失效问题。 &#x1f525;资源特点 精准区分 64 位新设备 / 32 位老设备&#xff0c;安装更适配全设备兼容&#xff1a;电视、盒子、手机…...

PostgreSQL 13.8 子查询优化实战:手把手教你读懂 `pull_up_sublinks` 源码

PostgreSQL 13.8 子查询优化实战&#xff1a;手把手教你读懂 pull_up_sublinks 源码 数据库查询优化器是数据库系统的核心组件之一&#xff0c;它负责将用户提交的SQL语句转换为高效的执行计划。在PostgreSQL中&#xff0c;子查询优化是查询优化的重要环节&#xff0c;而pull_u…...

如何快速配置PlotSquared:Minecraft领地管理完整教程

如何快速配置PlotSquared&#xff1a;Minecraft领地管理完整教程 【免费下载链接】PlotSquared PlotSquared - Reinventing the plotworld 项目地址: https://gitcode.com/gh_mirrors/pl/PlotSquared 你是否厌倦了Minecraft服务器中混乱的建筑和领地冲突&#xff1f;想要…...

终极指南:3步掌握Path of Building装备规划与角色构建

终极指南&#xff1a;3步掌握Path of Building装备规划与角色构建 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/gh_mirrors/pat/PathOfBuilding Path of Building是一款强大的离线Build规划工具&#xff0…...

格式改到心态崩?Paperxie 智能排版,一键把论文 “捏” 成学校模板

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 改完论文正文、降完重复率&#xff0c;本以为终于能喘口气&#xff0c;结果被导师一句 “格式全错&#xf…...

如何在Windows上完美使用苹果触控板:终极配置指南

如何在Windows上完美使用苹果触控板&#xff1a;终极配置指南 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad 还…...