leetcode:面试题 08.06. 汉诺塔问题

题目链接

面试题 08.06. 汉诺塔问题

题目描述

题目解析

  1. 当只有一个盘子时:直接从A柱放到C柱即可。
  2. 当有两个盘子时:将A柱第一个盘子先放到B柱,再将A柱第二个盘子放到C柱,最后将B柱上的盘子放到C柱子。
  3. 当有3个盘子时:先A柱上面两个盘子借助C柱放到B柱子,再将A柱上最后一个盘子放入C柱,最后将B柱子上的盘子借助A柱放入C柱。
  4. 当有n个盘子时:先A柱上n-1个盘子借助C柱放到B柱子,再将A柱上最后一个盘子放入C柱,最后将B柱子上的盘子借助A柱放入C柱。

解法1:纯递归

cpp 复制代码
// 方法一:纯递归
// my_hanota:将A柱子中最上面的n个盘子经由B移动到C中;也就是将A中后n个元素经由B移动到C中。
void my_hanota(int n, vector<int>& A, vector<int>& B, vector<int>& C) {
    if (n == 1)
    {
        C.push_back(A.back());  A.pop_back();
        return;
    }

    my_hanota(n - 1, A, C, B);
    C.push_back(A.back());  A.pop_back();
    my_hanota(n - 1, B, A, C);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
    int n = A.size();
    my_hanota(n, A, B, C);
}

解法2:体会参数的递归过程

cpp 复制代码
// 方法二:强迫使用一个参数,简单换一种递归思考方式
// m参数用于体验递归过程
// 用m表示最大的盘子在数组中的位置
void my_hanota(int n, int m, vector<int>& A, vector<int>& B, vector<int>& C)
{
    if (n == 1)
    {
        C[m] = A[m];
        return;
    }
    my_hanota(n - 1, m + 1, A, C, B);//将A中后n-1个元素经由C放入B
    C[m] = A[m];
    my_hanota(n - 1, m + 1, B, A, C);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {

    int n = A.size();
    B.resize(n);
    C.resize(n);
    int m = 0;
    my_hanota(n, 0, A, B, C);
}
相关推荐
ゞ 正在缓冲99%…5 小时前
leetcode2826.将三个组排序
算法·leetcode·动态规划
roykingw6 小时前
【思想比实现更重要】高并发场景下如何保证接口幂等性
java·web安全·面试
尘觉6 小时前
面试-浅复制和深复制?怎样实现深复制详细解答
javascript·面试·职场和发展
绝无仅有7 小时前
某教育大厂面试题解析:MySQL索引、Redis缓存、Dubbo负载均衡等
vue.js·后端·面试
mapbar_front7 小时前
面试谈薪资指南:掌握主动权的关键策略
面试
007php0079 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
微笑尅乐10 小时前
洗牌算法讲解——力扣384.打乱数组
算法·leetcode·职场和发展
绝无仅有10 小时前
腾讯面试文章解析:MySQL慢查询,存储引擎,事务,结构算法等总结与实战
后端·面试·github
天选之女wow10 小时前
【代码随想录算法训练营——Day48】单调栈——42.接雨水、84.柱状图中最大的矩形
算法·leetcode
松间沙路hba10 小时前
面试过程中的扣分项,你踩过几个?
面试·职场和发展