【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

在这里插入图片描述


🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

🎬艾莉丝的算法专栏简介:

在这里插入图片描述

文章目录


在这里插入图片描述

本文设计专题一算法题链接

面试题 08.06. 汉诺塔问题

21. 合并两个有序链表

206. 反转链表

24. 两两交换链表中的节点

50. Pow(x, n)


1 汉诺塔问题

题目描述

在这里插入图片描述

接下来,我们就来介绍一下这道题的算法原理。

汉诺塔问题(递归解法)

1. 问题描述

汉诺塔问题是一个经典的递归问题,规则如下:

  • 有三根柱子,记为 A(起始柱)B(辅助柱)C(目标柱)
  • A 柱上有 n 个盘子,从小到大叠放(从上到下编号为 1 到 n)。
  • 目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,并且大盘子不能放在小盘子上面
在这里插入图片描述

2. 递归思想

基本情况(递归终止条件)
  • n = 1 时,直接将 A 最上面的盘子移到 C。
递归分解(n ≥ 2)

若要将 A 上的 n 个盘子移到 C,可以分解为三个步骤:

  1. 将 A 上除了最底下的盘子(即上面 n-1 个盘子)移到 B(借助 C 作为辅助柱)。
  2. 将 A 最底下的最大盘子移到 C
  3. 将 B 上的 n-1 个盘子移到 C(借助 A 作为辅助柱)。

这样,规模为 n 的问题被拆分为两个规模为 n-1 的子问题

3. 递归算法流程(函数设计)

函数头
voidhanoi(vector<int>& A, vector<int>& B, vector<int>& C,int n);
  • 1、返回值:无;
  • 2、参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
  • 3、函数作用:将A中的上面n个盘子挪到C中。

递归函数流程:

  • 1、当前问题规模为n=1时,直接将A中的最上面盘子挪到C中并返回;
  • 2、递归将A中最上面的n-1个盘子挪到B中;
  • 3、将A中最上面的一个盘子挪到C中;
  • 4、将B中上面n-1个盘子挪到C中。

解题过程

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

算法实现(C++)

classSolution{public:voidhanota(vector<int>& a, vector<int>& b, vector<int>& c){dfs(a,b,c,a.size());}voiddfs(vector<int>& a, vector<int>& b, vector<int>& c,int n){if(n ==1){ c.push_back(a.back()); a.pop_back();return;}dfs(a,c,b,n -1); c.push_back(a.back()); a.pop_back();dfs(b,a,c,n -1);}// void dfs(x,y,z,int n)// void dfs(x,y,z,n - 1)// z = x.back();// dfs(y,x,z,n - 1);};

上面是面试题的处理,如果是笔试题,就可以不讲武德了——

classSolution{public:voidhanota(vector<int>& a, vector<int>& b, vector<int>& c){ c = a;}};

2 合并两个有序链表

题目描述

在这里插入图片描述

接下来,我们就来介绍一下这道题的算法原理。

解题过程

在这里插入图片描述


在这里插入图片描述

算法实现(C++)

classSolution{public: ListNode*mergeTwoLists(ListNode* l1, ListNode* l2){// 递归出口if(l1 ==nullptr)return l2;if(l2 ==nullptr)return l1;// 比大小if(l1->val <= l2->val){ l1->next =mergeTwoLists(l1->next,l2);return l1;}else{ l2->next =mergeTwoLists(l1,l2->next);return l2;}}};

3 反转链表

题目描述

在这里插入图片描述

接下来,我们就来介绍一下这道题的算法原理。

解题过程

在这里插入图片描述

算法实现(C++)

// 将链表看成一棵树/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */classSolution{public: ListNode*reverseList(ListNode* head){// 细节问题:找出口if(head ==nullptr|| head->next ==nullptr)return head;// 主逻辑 ListNode* newhead =reverseList(head->next); head->next->next = head; head->next =nullptr;// 最终返回结果return newhead;}};

4 两两交换链表中的节点

题目描述

在这里插入图片描述

接下来,我们就来介绍一下这道题的算法原理。

解题过程

在这里插入图片描述

算法实现(C++)

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */classSolution{public: ListNode*swapPairs(ListNode* head){// 出口if(head ==nullptr|| head->next ==nullptr)return head;// 节点为空或者是个尾节点,就不能交换// 宏观角度看待auto tmp =swapPairs(head->next->next);auto ret = head->next; head->next->next = head; head->next = tmp;// 返回最终结果return ret;}};

5 Pow(x, n)

题目描述

在这里插入图片描述

接下来,我们就来介绍一下这道题的算法原理。

解题过程

在这里插入图片描述


在这里插入图片描述

算法实现(C++)

classSolution{public:doublemyPow(double x,int n)// 主函数{// 细节问题:n可能是负数return n <0?1.0/Pow(x,-(longlong)n):Pow(x,n);}doublePow(double x,longlong n)// 快速幂{// 递归出口if(n ==0)return1.0;// x ^ 0 = 1// 递归double tmp =Pow(x,n /2);return n %2==0? tmp * tmp : tmp * tmp * x;}};

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习递归、搜索与回溯算法相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 一. 继承的概念与定义   1、继承的核心概念   2、继承的定义格式   3、继承方式与成员访问权限 二. 基类与派生类的转换:子类对象能当父类用吗? 三. 继承中的作用域:同名成员会冲突吗?   1、变量隐藏   2、函数隐藏 四、派生类的默认成员函数:构造、拷贝、析构怎么写?   1、构造函数:先调用父类构造,再初始化子类成员   2、拷贝构造:先拷贝父类,再拷贝子类   3、 赋值重载:

By Ne0inhk
2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲:  1、握手问题-(解析)-简单组合问题(别人叫她 鸽巢定理)😇,感觉叫高级了  2、小球反弹-(解析)-简单物理问题,不太容易想  3、好数-(解析)-简单运用分支计算  4、R 格式-(解析)-高精度,不是快速幂😉  5、宝石组合-(解析)-lcm推论(gcd、lcm结合)  6、数字接龙-(解析)-DFS(蓝桥专属、每年必有一道)  7、拔河-(解析)-定一端,动一端😎 题目: 1、握手问题 问题描述

By Ne0inhk