【递归、搜索与回溯算法必刷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

SpringBoot集成支付宝h5支付(移动端和web端,使用内网穿透测试)

SpringBoot集成支付宝h5支付(移动端和web端,使用内网穿透测试)

文章目录 *                                  文章目录 * 1.支付宝H5支付简介2.支付流程介绍3.接入准备4.内网穿透准备5.沙箱环境准备6.SpringBoot整合集成6.1建立工程引入依赖1.pom引入依赖2.配置yml文件3.AlipayProperties文件配置4.创建订单接口5.浏览器测试小结 1.支付宝H5支付简介 支付宝H5支付是一种适用于移动端浏览器的支付方式,用户无需下载支付宝App即可完成支付。适用于手机网页、微信内嵌浏览器等场景。 2.支付流程介绍 商家在网页应用中调用支付宝提供的网页支付接口,接口会调起支付宝客户端内的支付模块,此时会从商家网页应用跳转到支付宝客户端中并开始支付;支付完成后会跳转回商家网页应用内,最后商家展示支付结果。 步骤1:用户在浏览器中访问商家网页应用,选择商品下单、确认购买,进入支付环节,选择支付宝付款,用户点击去支付。 步骤2:进入到支付宝支付路由页面,支付宝处理支付请求,并尝试唤起支付宝客户端。 步骤3:进入到支付宝页面,调起支付宝客户端支付,出现确认支付界面。 步

By Ne0inhk
关于spring AI调用大模型的几种方案实践

关于spring AI调用大模型的几种方案实践

关于spring AI调用大模型的几种方案实践 背景介绍: spring AI 是java的ai框架,旨在简化应用程序的开发过程,在不增加不必要的复杂性的前提下整合 AI(人工智能)功能。我这里提供我平时调用的大模型的方法,供初学者参考。 具体方案 1、使用自动注入的方式调用 我们可以通过引入对应依赖,配置application.yml文件实现多个大模型配置 (1)导入对应依赖 <!-- 阿里的灵积 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.

By Ne0inhk
Spring Cloud之注册中心之Nacos负载均衡

Spring Cloud之注册中心之Nacos负载均衡

目录 负载均衡 服务下线 权重配置 配置权重 解决办法 常见问题 同集群优先访问 给实例配置集群名称 开启Nacos负载均衡策略 负载均衡 ⽣产环境相对是⽐较恶劣的, 我们需要对服务的流量进⾏更加精细的控制. Nacos⽀持多种负载均衡策略, 包括权重, 同机房, 同地域, 同环境等. 服务下线 当某⼀个节点上接⼝的性能较差时, 我们可以第⼀时间对该节点进⾏下线.操作步骤: 服务详情 -> 下线 点击下线后, 再次请求接⼝, 会发现该服务没有请求进来了。 再次单击上线, 该节点会继续收到请求。下线之前 下线端口号为9091的服务进程之后: 权重配置 除了下线之外, 我们也可以配置这个节点的流量权重。 配置权重 操作步骤: 找到对应节点 ->编辑 -&

By Ne0inhk

SQLyog ultimate 13.1.1版本,附注册码

sqlyog 13.1.1 旗舰版 链接: https://pan.baidu.com/s/1RaVfXuHip18oTIS1VmHmuQ?pwd=ucvb  提取码: ucvb  sqlyog 12.0.8.0 旗舰版 链接: https://pan.baidu.com/s/1nEcRBZOD4YEwSDlWJsueww?pwd=shnr  提取码: shnr  13的版本12的版本安装步骤相同,以13.1.1的版本为例 安装 64位电脑选择x64.exe,32位电脑选择x86.exe,双击执行 默认是简体中文,不用修改,点击ok,然后再点击下一步 接受许可点击下一步,然后再下一步,进入选择安装目录的环节

By Ne0inhk