力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现

简介: 力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现

第一部分:问题描述

1.1 题目

🏠 链接:面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

⭐ 难度:简单

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:

  1. 每次只能移动一个盘子;
  2. 盘子只能从柱子顶端滑出移到下一根柱子;
  3. 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

1.2 示例

🍀 示例一

输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]

🍀 示例二

输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]

1.3 提示

A中盘子的数目不大于14个。

第二部分:思路分析

假设每根柱子标号 a,b,c,每个圆盘用 1,2,3 … 表示其大小,圆盘初始在 a,要移动到的目标是 c

1️⃣ 移动一个圆盘

如果只有一个圆盘,此时是最小问题,可以直接求解

  • 移动圆盘1 a ↦ c

2️⃣ 移动两个圆盘

如果有两个圆盘,那么

  • 圆盘1 ab
  • 圆盘2 ac
  • 圆盘1 bc

3️⃣ 移动三个圆盘

如果有三个圆盘,那么

  • 圆盘12 ab
  • 圆盘3 ac
  • 圆盘12bc

4️⃣ 移动四个圆盘

如果有四个圆盘,那么

  • 圆盘 123ab
  • 圆盘 4 ac
  • 圆盘 123 bc

因此,如果有n个圆盘,那么

  • 圆盘 1~(n-1) ab
  • 圆盘 n ac
  • 圆盘 1~(n-1) bc

而 n-1 个圆盘如何移动呢,重复父问题的操作即可。

第三部分:代码实现

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        recursion(A.size(), A, B, C);
    }
    private void recursion(int n, List<Integer> A, List<Integer> B, List<Integer> C) {
        // 先判断需要移动的圆盘数 n 是否为 0
        if (n == 0) {
            return;
        }
        // 将 n-1 个圆盘借助 C 从 A 移动到 B
        recursion(n - 1, A, C, B);
        // 将 第 n 个圆盘从 A 移动到 C
        C.add(A.remove(A.size() - 1));
        // 将 n-1 个圆盘借助 A 从 B 移动到 C
        recursion(n - 1, B, A, C);
    }
}


相关文章
|
4月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
4月前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
4月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
107 4
|
4月前
|
JavaScript 前端开发 程序员
JS小白请看!一招让你的面试成功率大大提高——规范代码
JS小白请看!一招让你的面试成功率大大提高——规范代码
|
5月前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
226 2
|
5月前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
73 3
|
5月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
71 0
|
5月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
125 0
|
5月前
|
Java
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
32 0
|
5月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
下一篇
DataWorks