算法专题十一: 基础递归

目录

  • 1. 汉诺塔
  • 2. 合并两个有序链表
  • 3. 反转链表
  • 4. 两两交换链表中的节点
  • 5. Pow(x, n)

1. 汉诺塔

题目链接: Leetcode汉诺塔

在这里插入图片描述

算法原理:

递归:宏观视角理解递归
本道题为什么能用递归? 让我们逐一分析
首先思考我们如何来解决汉诺塔问题:

  1. 当N = 1 时, 我们仅需将A上的盘子直接挪到C即可

在这里插入图片描述

  1. 当N = 2时, 把A上的盘子转移到B上,再把A的最后一个盘子转移到C上,最后再把B上的盘子转移到C上。

在这里插入图片描述
3. 当N = 3时跟N = 2的思路一样, 先把B上的n-1个盘子转移到B上(借助C),再把A上的最后一个盘子转移到C上, 最后将B上的盘子转移到C上(借助A),

在这里插入图片描述
4. 当N = 4时,
在这里插入图片描述

解决大问题时具有相同的子问题时,解决子问题又出现相同类型的子问题时就可以使用递归。
根据重复的子问题,设计函数头
只根据某一个具体的子问题在做什么,设计函数体

编写代码:

class Solution {
public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {int n = a.size();dfs(a, b, c, n);}void dfs(vector<int>& a, vector<int>& b, vector<int>& c, int n){//递归出口,当n == 1时就可以直接转移,无需借助其他柱子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);}
};

2. 合并两个有序链表

题目链接:合并两个有序链表

在这里插入图片描述

算法原理:

先比大小,让小的那个节点连上后面合并好的链表。

在这里插入图片描述

/*** 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) {}* };*/
class Solution {
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. 反转链表

在这里插入图片描述
算法原理:

从宏观角度看待问题:

  1. 让当前节点后面的节点先逆置, 并且把新的头节点返回
  2. 让当前节点添加到新的节点后面即可。

边界情况:
当链表为空或者只有一个节点, 返回当前节点即可,即为递归出口。

在这里插入图片描述

编写代码:

/*** 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) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* newhaed = reverseList(head->next);head->next->next = head;head->next = nullptr;return newhaed;}
};

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

题目链接: 两两交换链表中的节点

在这里插入图片描述
算法原理:

  1. 先将当前两个节点之后的节点进行交换, 然后在交换当前节点
  2. 如果当前节点为空或者只有一个节点就不用交换了, 直接返回即可
  3. 让当前节点的下一个节点的next指向当前节点, 并且让当前节点指向tmp即上一层已经交换好的链表,并且返回当前节点的下一个节点。

在这里插入图片描述

编写代码:

/*** 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) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* tmp = swapPairs(head->next->next);ListNode* next = head->next;head->next->next = head;head->next = tmp;return next;}
};

5. Pow(x, n)

题目链接: Pow(x, n)

在这里插入图片描述

算法原理:这个就是求x的n次方, 如果使用暴力解法, 当n特别大时是会超时的, ,那么我们采用第二种思路, 递归的思想

  1. 如果求3的16次方, 我们可以先算出3的8次方*3的8次方, 按照下面的图进行求解
  2. 求解子问题设计函数头 就转化为定义一个函数, 你给我返回它的一半的值,
    如果是奇数就再乘以当前的数, 如果是偶数就直接tmp*tmp即为结果
  3. 递归的出口就是当n == 0时, 返回1即可。注意处理负数的情况。
    在这里插入图片描述

编写代码:

class Solution {
public:double myPow(double x, int n) {return n < 0 ? 1 / pow(x, -(long long)n) : pow(x, n);}double pow(double x, long long n){if(n == 0) return 1.0;double tmp = pow(x , n / 2);return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cmakelist.txt之win-c-udp-client

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(c_udp_client LANGUAGES C) ​ add_executable(c_udp_client main.c) ​ target_link_libraries(c_udp_client wsock32) ​ ​ include(GNUInstallDirs) install(TARGETS c_udp_clientLIBRARY DESTINATION $…

Git错误:gnutls_handshake() failed: The TLS connection was non-properly terminated

最终我通过这个博客解决了问题&#xff1a;解决Git错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated 解决方案 1. 检查网络连接 首先&#xff0c;确保你的网络连接是稳定的。尝试访问其他HTTPS网站或服务&#xff0c;以排除网络问…

用Python做一个websocket服务端

我对websocket服务端的功能定义是&#xff1a; 1.能将client端的软硬件信息关联&#xff08;如client_name和对应ip:port&#xff09;&#xff0c;且不支持重复关联; 2.可以判断接收自client端的消息属于哪种任务&#xff0c;并对应执行&#xff08;如关联、发消息&#xff0…

Lua如何连接MySQL数据库?

大家好&#xff0c;我是袁庭新。使用Lua语言如何来连接数据库呢&#xff1f;新哥这篇文章给你安排上。 1 LuaSQL概述 LuaSQL是一个轻量级的Lua到数据库管理系统&#xff08;DBMS&#xff09;的接口库&#xff0c;由Kepler Project维护&#xff0c;且是开源的。它提供了一个简…

机器学习基础07

目录 1.逻辑回归 1.1原理 1.2API 2.K-Means 2.1算法过程 2.2API 3.SVM&#xff08;支持向量机&#xff09; 3.1算法原理​ 3.2API 1.逻辑回归 逻辑回归(Logistic Regression)是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法。 1.1原理 逻辑回归的输…

VMware Workstation 17.6.1

概述 目前 VMware Workstation Pro 发布了最新版 v17.6.1&#xff1a; 本月11号官宣&#xff1a;针对所有人免费提供&#xff0c;包括商业、教育和个人用户。 使用说明 软件安装 获取安装包后&#xff0c;双击默认安装即可&#xff1a; 一路单击下一步按钮&#xff1a; 等待…

解决 VMware 嵌套虚拟化提示 关闭“侧通道缓解“

最近给电脑做了新版的 Windows 11 LTSC操作系统&#xff0c;在启动VMware Workstation时&#xff0c;提示"此虚拟机已启用侧通道缓解&#xff0c;可增强安全性&#xff0c;但也会降低性能"&#xff0c;但是我没有启用 Hyper-V 相关的任何功能以及 WSL&#xff0c; 从…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

目录 一&#xff0c;数组翻转 二&#xff0c;冒泡排序 三&#xff0c;二分查找&#xff08;一尺之锤&#xff0c;日取其半&#xff0c;万世不竭&#xff09; 一&#xff0c;数组翻转 1.概述:数组对称索引位置上的元素互换&#xff0c;最大值数组序号是数组长度减一 创建跳板…

数据结构-7.Java. 对象的比较

本篇博客给大家带来的是java对象的比较的知识点, 其中包括 用户自定义类型比较, PriorityQueue的比较方式, 三种比较方法...... 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .…

悬浮框元素定位

Web页面中调试悬浮元素的方法 在UI自动化测试或Web开发中&#xff0c;悬浮框的特点是鼠标进入时弹出&#xff0c;鼠标离开时消失。这种动态特性导致普通方法难以直接定位悬浮框内的元素。所以需要冻结页面或使用模拟Hover状态来进行调试。 方法一&#xff1a;冻结页面进行调试…

IDEA算法的详细介绍及Python实现

目录 IDEA算法的详细介绍及Python实现引言第一部分:IDEA算法的原理与背景1.1 IDEA算法的来源与特点1.2 IDEA算法的核心步骤第二部分:IDEA算法的Python实现(面向对象设计)2.1 核心类设计2.2 代码实现2.3 使用示例第三部分:案例1 - 函数优化问题(策略模式)3.1 问题描述3.2…

「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解

本篇将详细介绍 Cangjie 中的浮点类型&#xff0c;包括浮点数的表示方法、精度、舍入与溢出处理、科学计数法表示、字面量的进制表示、常用运算、类型转换及应用场景&#xff0c;帮助开发者掌握浮点数的使用方法。 关键词 浮点类型表示精度与舍入溢出与下溢科学计数法类型转换…

MAC借助终端上传jar包到云服务器

前提&#xff1a;保证工程本地已打包完成&#xff1a;图中路径即为项目的target目录下已准备好的jar包 第一步&#xff1a;打开终端&#xff08;先不要连接自己的服务器&#xff09;&#xff0c;输入下面的上传命令&#xff1a; scp /path/to/local/app.jar username192.168.1…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

基于Python Web的社区爱心养老管理系统设计与实现

摘 要 随着社会老龄化的加剧&#xff0c;养老问题日益凸显。为了解决社区养老服务的管理难题&#xff0c;本文提出了一种基于互联网技术的社区爱心养老管理系统。该系统采用B/S架构&#xff0c;结合Web前端技术和后端数据库技术&#xff0c;实现了对社区养老服务的全面管理。系…

在 Ubuntu 上使用 Traefik Proxy 为 Docker 容器设置反向代理

简介 Traefik&#xff08;发音为"traffic"&#xff09;是一个开源的反向代理和负载均衡器。它为微服务架构提供了网络入口&#xff0c;特别是在动态、服务密集的环境中&#xff08;如容器、微服务架构&#xff09;。由于其设计灵活且易于实施&#xff0c;Traefik 成…

有关博客博客系统的测试报告 --- 初次进行项目测试篇

文章目录 前言一、博客系统的项目背景二、博客系统的项目简介1.后端功能1.1 用户管理1.2 博客管理1.3 权限管理 2.前端功能2.1 用户界面 测试计划测试工具、环境设计的测试动作功能测试访问博客登录页面博客首页测试博客详情页博客编辑页 自动化测试自动化测试用例自动化测试脚…

Redis 性能优化 18招

前言 Redis在我们的日常开发工作中&#xff0c;使用频率非常高&#xff0c;已经变成了必不可少的技术之一。 Redis的使用场景也很多。 比如&#xff1a;保存用户登录态&#xff0c;做限流&#xff0c;做分布式锁&#xff0c;做缓存提升数据访问速度等等。 那么问题来了&…

Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持

作者&#xff1a;来自 Elastic Saikat Sarkar 使用 Elasticsearch 向量数据库构建搜索 AI 体验时如何使用 IBM watsonx™ Slate 文本嵌入。 Elastic 很高兴地宣布&#xff0c;通过集成 IBM watsonx™ Slate 嵌入模型&#xff0c;我们的开放推理 API 功能得以扩展&#xff0c;这…

ts- declare关键词及vue3报错“Window typeof globalThis”上不存在属性“nextLoading”、`

报错“Window & typeof globalThis”上不存在属性“nextLoading”、 代码环境&#xff1a;vue3、ts 阮一峰讲解 declarets 用法告诉编译器某个类型是存在的 下面的例子是脚本使用浏览器全局对象document。 declare var document; document.title "Hello";上面…