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

LeetCode 08.06 面试题 汉诺塔 (Java)

经典递归解决汉诺塔问题:清晰的三步移动策略

问题描述

在汉诺塔问题中,有 3 根柱子和 N 个大小不同的盘子,盘子初始按升序堆叠在第一根柱子上(最小的在顶部)。目标是将所有盘子移动到第三根柱子上,并满足以下规则:

  1. 每次只能移动一个盘子
  2. 盘子只能从柱子的顶端移出
  3. 盘子只能叠放在比它大的盘子上
递归思路

汉诺塔问题的核心思想是将问题分解为三个步骤(假设有 n 个盘子):

  1. 移动上层 n-1 个盘子:将前 n-1 个盘子从源柱 A 借助目标柱 C 移动到辅助柱 B
  2. 移动底层最大盘子:将剩余的最后一个盘子(最大的)从 A 直接移动到目标柱 C
  3. 移动 n-1 个盘子归位:将 B 上的 n-1 个盘子借助 A 移动到目标柱 C

通过递归重复这三个步骤,最终完成所有盘子的移动。递归终止条件是当盘子数量为 0 时直接返回。

代码实现(带详细注释)
class Solution {public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {move(A.size(), A, B, C); // 启动递归过程print(C);	//打印结果}/*** 递归移动盘子* @param n 要移动的盘子数量* @param a 源柱(起始柱)* @param b 辅助柱(借助柱)* @param c 目标柱(目标柱)*/public static void move(int n, List<Integer> a, List<Integer> b, List<Integer> c) {// 递归终止条件:没有盘子可移动时返回if (n == 0) {return;}// 1. 将 a 上方的 n-1 个盘子借助 c 移动到 bmove(n - 1, a, c, b);// 2. 将 a 底部最后一个盘子(当前最大)移动到 cc.add(a.remove(a.size() - 1));// 3. 将 b 上的 n-1 个盘子借助 a 移动到 cmove(n - 1, b, a, c);}/*** 打印目标柱子* @param list*/public static void print(List<Integer> list){System.out.println(list);}}
关键点解析
  1. 递归分解
    • 每次递归将问题拆解为更小规模的子问题(n-1 个盘子)
    • 通过三次递归调用实现三层移动逻辑
  2. 柱子角色转换
    • 第一步中:目标柱 C 充当辅助柱,辅助柱 B 充当目标柱
    • 第三步中:源柱 A 充当辅助柱,辅助柱 B 充当源柱
  3. 栈操作
    • 使用 list.remove(list.size()-1) 移除栈顶元素(时间复杂度 O(1))
    • 使用 list.add() 将元素放入目标柱顶部
复杂度分析
  • 时间复杂度 O ( 2 n ) O(2^n) O(2n)
    每次递归产生两个子调用,移动 n 个盘子需要 2 n − 1 2^n-1 2n1 次操作
  • 空间复杂度 O ( n ) O(n) O(n)
    递归调用栈的最大深度为 n(盘子数量)
示例解析

以输入 A = [1, 0] 为例(列表尾部表示柱顶):

  1. 第一步:移动上层盘子 0AB
    • 操作后:A=[1], B=[0], C=[]
  2. 第二步:移动底层盘子 1AC
    • 操作后:A=[], B=[0], C=[1]
  3. 第三步:移动 B 上的 0C
    • 操作后:A=[], B=[], C=[1, 0]

最终 C=[1, 0] 符合要求(1 在底部,0 在顶部)。

注意:列表中的顺序 [1, 0] 表示柱子上 1 在底部、0 在顶部,满足小盘在大盘之上的规则。该解法直接修改原列表,符合原地操作要求。

相关文章:

LeetCode 08.06 面试题 汉诺塔 (Java)

经典递归解决汉诺塔问题&#xff1a;清晰的三步移动策略 问题描述 在汉诺塔问题中&#xff0c;有 3 根柱子和 N 个大小不同的盘子&#xff0c;盘子初始按升序堆叠在第一根柱子上&#xff08;最小的在顶部&#xff09;。目标是将所有盘子移动到第三根柱子上&#xff0c;并满足…...

使用MinIO搭建自己的分布式文件存储

目录 引言&#xff1a; 一.什么是 MinIO &#xff1f; 二.MinIO 的安装与部署&#xff1a; 三.Spring Cloud 集成 MinIO&#xff1a; 1.前提准备&#xff1a; &#xff08;1&#xff09;安装依赖&#xff1a; &#xff08;2&#xff09;配置MinIO连接&#xff1a; &…...

单元测试与QTestLib框架使用

一.单元测试的意义 在软件开发中&#xff0c;单元测试是指对软件中最小可测试单元&#xff08;通常是函数、类的方法&#xff09;进行隔离的、可重复的验证。进行单元测试具有以下重要意义&#xff1a; 1.提升代码质量与可靠性&#xff1a; 早期错误检测&#xff1a; 在开发…...

java面试场景题:QPS 短链系统怎么设计

以下是对文章的润色版本&#xff1a; 这道场景设计题&#xff0c;初看似乎业务简单&#xff0c;实则覆盖的知识点极为丰富&#xff1a; 高并发与高性能分布式 ID 生成机制&#xff1b;Redis Bloom Filter——高并发、低内存损耗的过滤组件知识&#xff1b;分库、分表海量数据存…...

java面试场景提题:

以下是润色后的文章&#xff0c;结构更清晰&#xff0c;语言更流畅&#xff0c;同时保留了技术细节&#xff1a; 应对百倍QPS增长的系统设计策略 整体架构设计思路 面对突发性百倍QPS增长&#xff0c;系统设计需从硬件、架构、代码、数据四个维度协同优化&#xff1a; 硬件层…...

K7 系列各种PCIE IP核的对比

上面三个IP 有什么区别&#xff0c;什么时候用呢&#xff1f; 7 series Integrated Block for PCIE AXI Memory Mapped to PCI Express DMA subsystem for PCI Express 特点 这是 Kintex-7 内置的 硬核 PCIe 模块。部分事务层也集成在里面&#xff0c;使用标准的PCIE 基本没…...

natapp 内网穿透失败

连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn...

深入解析CI/CD开发流程

引言&#xff1a;主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署&#xff0c;但是自己不是太了解什么意思&#xff0c;所以就自己查了一下ci/cd相关的资料&#xff0c;整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写&#xff0c;旨在简化并…...

Docke启动Ktransformers部署Qwen3MOE模型实战与性能测试

docker运行Ktransformers部署Qwen3MOE模型实战及 性能测试 最开始拉取ktransformers:v0.3.1-AVX512版本&#xff0c;发现无论如何都启动不了大模型&#xff0c;后来发现是cpu不支持avx512指令集。 由于本地cpu不支持amx指令集&#xff0c;因此下载avx2版本镜像&#xff1a; …...

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用

在量子技术飞速发展的今天&#xff0c;实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器&#xff08;AWG&#xff09;作为精准信号控制的核心设备&#xff0c;在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…...

相机--相机标定实操

教程 camera_calibration移动画面示例 usb_cam使用介绍和下载 标定流程 单目相机标定 我使用的是USB相机&#xff0c;所以直接使用ros的usb_cam功能包驱动相机闭关获取实时图像&#xff0c;然后用ros的camera_calibration标定相机。 1,下载usb_cam和camera_calibration: …...

深入理解汇编语言中的顺序与分支结构

本文将结合Visual Studio环境配置、顺序结构编程和分支结构实现&#xff0c;全面解析汇编语言中的核心编程概念。通过实际案例演示无符号/有符号数处理、分段函数实现和逻辑表达式短路计算等关键技术。 一、汇编环境配置回顾&#xff08;Win32MASM&#xff09; 在Visual Studi…...

DAY43 复习日

浙大疏锦行-CSDN博客 kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;把项目拆分成多个文件 src/config.py: 用于存放项目配置&#xff0c;例如文件路径、学习率、批次大小等。 # src/config.py# Paths DATA_DIR "data…...

【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计

仿生机器人智能架构&#xff1a;从感知到个性的完整设计 仿生机器人不仅需要模拟人类的外表&#xff0c;更需要具备类人的认知、情感和个性特征。本研究提出了一个综合性的软件架构&#xff0c;实现了从环境感知到情感生成、从实时交互到人格塑造的完整智能系统。该架构突破了…...

【业务框架】3C-相机-Cinemachine

概述 插件&#xff0c;做相机需求&#xff0c;等于相机老师傅多年经验总结的工具 Feature Transform&#xff1a;略Control Camera&#xff1a;控制相机参数Noise&#xff1a;增加随机性Blend&#xff1a;CameraBrain的混合列表指定一个虚拟相机到另一个相机的过渡&#xff…...

【Auto.js例程】华为备忘录导出到其他手机

目录 问题描述方法步骤1.安装下载Visual Studio Code2.安装扩展3.找到Auto.js插件&#xff0c;并安装插件4.启动服务器5.连接手机6.撰写脚本并运行7.本文实现功能的代码8.启动手机上的换机软件 问题描述 问题背景&#xff1a;华为手机换成一加手机&#xff0c;华为备忘录无法批…...

单片机的低功耗模式

什么是低功耗&#xff1f; STM32的低功耗&#xff08;low power mode&#xff09;特性是其嵌入式处理器系列的一个重要优势&#xff0c;特别适用于需要长时间运行且功耗敏感的应用场景&#xff0c;如便携式设备、物联网设备、智能家居系统等。 在很多应用场合中都对电子设备的…...

架构师级考验!飞算 JavaAI 炫技赛:AI 辅助编程解决老项目难题

当十年前 Hibernate 框架的 N1 查询隐患在深夜持续困扰排查&#xff0c;当 SpringMVC 控制器中错综复杂的业务逻辑在跨语言迁移时令人抓狂&#xff0c;企业数字化进程中的百万行老系统&#xff0c;已然成为暗藏危机的 “技术债冰山”。而此刻&#xff0c;飞算科技全新发布的 Ja…...

手机端抓包大麦网抢票协议:实现自动抢票与支付

&#x1f680; 手机端抓包大麦网抢票协议&#xff1a;实现自动抢票与支付 &#x1f680; &#x1f525; 你是否还在为抢不到热门演出票而烦恼&#xff1f;本文将教你如何通过抓包技术获取大麦网抢票协议&#xff0c;并编写脚本实现自动化抢票与支付&#xff01;&#x1f525; …...

使用阿里云百炼embeddings+langchain+Milvus实现简单RAG

使用阿里云百炼embeddingslangchainMilvus实现简单RAG 注意测试时&#xff0c;替换其中的key、文档等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…...

C#合并CAN ASC文件:实现与优化

C#合并CAN ASC文件&#xff1a;实现与优化 在汽车电子和工业控制领域&#xff0c;CAN&#xff08;Controller Area Network&#xff09;总线是一种广泛使用的通信协议。CAN ASC&#xff08;American Standard Code&#xff09;文件则是记录CAN总线通信数据的标准格式&#xff…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境

问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时&#xff0c;提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0&#xff0c;而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本&#xff0c;但为了不影响其他程序&#xff0c;需…...

如何思考?分析篇

现代人每天刷 100 条信息&#xff0c;却难静下心读 10 页书。 前言&#xff1a; 我一直把思考当作一件生活中和工作中最为重要的事情。但是我发现当我想写一篇跟思考有关的文章时&#xff0c;却难以下手。因为思考是一件非常复杂的事情&#xff0c;用文字描述十分的困难。 读书…...

Redis:Hash数据类型

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Redis &#x1f525; Hash哈希 &#x1f433; ⼏乎所有的主流编程语⾔都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在Redis中&#…...

抗辐照MCU在卫星载荷电机控制器中的实践探索

摘要:在航天领域&#xff0c;卫星系统的可靠运行对电子元件的抗辐照性能提出了严苛要求。微控制单元&#xff08;MCU&#xff09;作为卫星载荷电机控制器的核心部件&#xff0c;其稳定性与可靠性直接关系到卫星任务的成败。本文聚焦抗辐照MCU在卫星载荷电机控制器中的应用实践&…...

快捷键的记录

下面对应的ATL数字 ATL4 显示编译输出 CTRL B 编译 CTRLR 运行exe 菜单栏 ALTF ALTE ALTB ALTD ALTH...

Python读取阿里法拍网的html+解决登录cookie

效果图 import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lxml import etreedef get_taobao_auct…...

electron-vite串口通信

一、构建项目后&#xff0c;安装“串口通信库” npm install serialport二、设置 npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild 注意&#xff1a;如果执行报错以下问题 1、未配置python变量 2、没有Microsoft Visual Studio BuildTools 3…...

中山大学美团港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。

由中山大学、美团、香港科技大学联合提出的MultiTalk是一个用于音频驱动的多人对话视频生成的新框架。给定一个多流音频输入和一个提示&#xff0c;MultiTalk 会生成一个包含提示所对应的交互的视频&#xff0c;其唇部动作与音频保持一致。 相关链接 论文&#xff1a;https://a…...

Maven的配置与运行

maven配置国内镜像 <!-- # %MAVEN_HOME%\conf\settings.xml # 找到 <mirrors> 标签&#xff0c;添加&#xff1a; --> <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>htt…...