【LeetCode】十二、递归:斐波那契 + 反转链表

文章目录

  • 1、递归
  • 2、leetcode509:斐波那契数列
  • 3、leetcode206:反转链表
  • 4、leetcode344:反转字符串

1、递归

函数自己调用自己

在这里插入图片描述

递归的4个点:

在这里插入图片描述

递归的例子:给一个数n,在斐波那契数列中,找到n对应的值

在这里插入图片描述

已知,f(0) = 0,f(1) = 1,求f(n)
在这里插入图片描述

一直拆f(n),直到拆到f(0)或者f(1)时终止,这就是函数能return的条件(终止条件),拆解条件则是

f(n) = f(n-1) + f(n-2)

接收的参数自然是n,根据递归这四个点,写递归函数:

在这里插入图片描述

2、leetcode509:斐波那契数列

在这里插入图片描述

public class P509 {public static int recursion(int n) {if (n < 2) {return n == 0 ? 0 : 1;}return recursion(n - 1) + recursion(n - 2);}
}

3、leetcode206:反转链表

在这里插入图片描述
之前引入了虚拟节点,遍历,修改next指针,来实现了反转。其实倒过来应该想到栈,先放进去,再倒出来,就反转了。

这里用递归,也是栈的味道:将节点的next值往下传,直到末尾节点,return,如上面示例中的,到5时终止递归,下一层到节点4,将5的指向改为4,此时4、5互指,为了防止环形链表的出现,将4到5的next指向给断掉。

1->2->3->4<->5
1->2->3->4<-5

返回节点4时,将5指向4,即node.next.next = node

public class P206Two {/*** 每次执行reverseList方法的参数:* 第一次递归:head = 1,拆解后向下传入的是head.next,为2* 第二次递归:head等于上一层传入的值,head = 2,向下传入的参数为3* 第三次递归:head等于上一层传入的值,head = 3,向下传入的参数为4* 第四次递归:head等于上一层传入的值,head = 4,向下传入的参数为5* 第五次递归:head等于5,return,这层的reverseList方法执行结束* 开始回溯:* 到第四次递归:继续往下执行方法,head = 4,head.next.next 即 5.next,执行head,即把5指向4* 到第三次递归:继续往下执行方法,head = 3,head.next.next 即 4.next,执行head,即把4指向3*/public static ListNode reverseList(ListNode head) {if (null == head || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}
}

4、leetcode344:反转字符串

在这里插入图片描述
这个题用双指针最好,指针L在开始,指针r在末尾,两个指针对向移动,一直互换元素,直到 L >= r。如下,h和o互换,左右指针移动,e和l互换……

在这里插入图片描述
这里以双指针的思想为基础,硬套一层递归来实现:还是L和r两个指针,递归终止的条件是 L >= r,递归的拆解则是每次L指针+1,r指针-1,递归要传递的参数不再是一个,而是L和 r 两个,上一层递归结束,回溯回来时,交换L和r位置的元素

public class P344 {/*** 双指针解法*/public static char[] reverseStringByTwoPoint(String s) {if (null == s || s.length() == 0){return null;}char[] charArray = s.toCharArray();int left = 0;int right = charArray.length - 1;while (left < right) {char temp;temp = charArray[left];charArray[left] = charArray[right];charArray[right] = temp;left++;right--;}return charArray;}/*** 双指针思想为基础,套一层栈的解法*/public static char[] reverseStringByRecursion(String s) {if (null == s || s.length() == 0){return null;}char[] charArray = s.toCharArray();int left = 0;int right = charArray.length - 1;return recursion(charArray, left, right);}public static char[] recursion(char[] charArray, int left, int right){// 递归终止的条件if (left >= right) {return charArray;}// 递归的拆解char[] array = recursion(charArray, left + 1, right - 1);// 上一层递归结束,回溯回来时,交换元素顺序char temp = array[left];array[left] = array[right];array[right] = temp;return array;}}

以hello为例,第一层递归,L = 0,R = 4,进入第二层递归,L = 1,R = 3,进入第三层递归,L= 2,R = 2,此时,触底,第三层递归函数执行return,结束,出栈。退到第二层递归,此时的L = 1, R = 3,交换这两个位置的元素,函数执行完成,出栈。退到第一层递归,此时L = 0,R = 4,交换这两个位置的元素,出栈。到此,三层递归都结束,方法执行结束。

递归时,盯清楚每一层递归时,参数等于多少,等递归回溯回来时,往下执行还要用。也别和传到下一层的参数混淆,因为用递归就会有参数拆解,每层递归函数里,值都不一样。如上,第一层递归,L = 0,R = 4,但其传入下一层递归的L和R分别为1和3

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

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

相关文章

科研与英文学术论文写作指南——于静老师课程

看到了一个特别棒的科研与英文学术论文写作指南&#xff0c;理论框架实例。主讲人是中科院信息工程研究所的于静老师。推荐理由&#xff1a;写论文和读论文或者讲论文是完全不一样的&#xff0c;即使现在还没有发过论文&#xff0c;但是通过于老师的课程&#xff0c;会给后续再…

LSTM水质预测模型实践

0 引言 随着水质自动站的普及&#xff0c;监测频次越来越高&#xff0c;自动监测越来越准确。 水质站点增多&#xff0c;连续的水质监测数据&#xff0c;给水质预测提供更多的训练基础。 长短时记忆网络(LSTM)适用于多变量、连续、自相关的数据预测。 人工神经网络模型特点为的…

使用requests爬取拉勾网python职位数据

爬虫目的 本文是想通过爬取拉勾网Python相关岗位数据&#xff0c;简单梳理Requests和xpath的使用方法。 代码部分并没有做封装&#xff0c;数据请求也比较简单&#xff0c;所以该项目只是为了熟悉requests爬虫的基本原理&#xff0c;无法用于稳定的爬虫项目。 爬虫工具 这次…

LVS 负载均衡群集

一&#xff1a;LVS群集应用基础 1.1&#xff1a;概述 1.群集的类型 无论是哪种群集&#xff0c; 都至少包括两台节点服务器&#xff0c; 而对外表现为一个整体&#xff0c; 只提供一个访问入口。根据群集所针对的目标差异&#xff0c; 可分为以下三种类型。 负载均衡群集&a…

使用U盘重装系统

目录 一、 制作启动盘 1. 准备一个U盘和一台电脑 2. 下载win10安装包 二、安装操作系统 1. 插入系统安装盘 2. 通过进入BIOS界面进入到我们自己制作的启动盘上 三、安装成功后进行常规设置 一、 制作启动盘 1. 准备一个U盘和一台电脑 注意&#xff1a;提前备份好U盘内的…

jQuery Tooltip 插件使用教程

jQuery Tooltip 插件使用教程 引言 jQuery Tooltip 插件是 jQuery UI 套件的一部分,它为网页元素添加了交互式的提示框功能。通过这个插件,开发者可以轻松地为链接、按钮、图片等元素添加自定义的提示信息,从而增强用户的交互体验。本文将详细介绍如何使用 jQuery Tooltip…

JDK1.8下载、安装与配置完整图文2024最新教程

一、报错 运行Pycharm时&#xff0c;报错No JVM installation found. Please install a JDK.If you already have a JDK installed, define a JAVA_HOME variable in Computer >System Properties > System Settings > Environment Variables. 首先可以检查是否已安装…

【C语言】qsort()函数详解:能给万物排序的神奇函数

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 目录 一.qsort()函数的基本信息及功能 二.常见的排序算法及冒泡排序 三.逐一解读qsort()函数的参数及其原理 1.void* base 2.size_t num 3.size_t size 4.int (*compar)(c…

2024西安国际储能产业博览会将于12月5日开幕!

2024西部国际储能产业博览会 同期举办&#xff1a;2024西部国际氢能源及燃料电池产业博览会 2024年12月5-7日 西安国际会展中心 规划展会规模&#xff1a; 50,000 ㎡ 450 60000人次 20场 展区面积 预邀展商 专业观众 行业…

节水增效,蜂窝物联智能灌溉助力农业升级!

智能灌溉的优势主要体现在以下几个方面&#xff1a; 1. 提高效率&#xff1a;智能灌溉可以根据作物生长的不同阶段和环境条件自动调整灌溉时间和水量&#xff0c;减少人工干预的频率和时间&#xff0c;提高了灌溉效率。 2. 节约水资源&#xff1a;智能灌溉可以根据土壤湿度和…

Python爬虫实战案例——王者荣耀皮肤抓取

大家好&#xff0c;我是你们的老朋友——南枫&#xff0c;今天我们一起来学习一下该如何抓取大家经常玩的游戏——王者荣耀里面的所有英雄的皮肤。 老规矩&#xff0c;直接上代码&#xff1a; 导入我们需要使用到的&#xff0c;也是唯一用到的库&#xff1a; 我们要抓取皮肤其…

网络物理隔离

网络物理隔离是网络安全领域中的一种基本策略&#xff0c;其核心目的是通过物理方式将网络或网络设备分隔开来&#xff0c;以确保数据安全、降低风险并提升系统的整体安全性。网络物理隔离不仅防止了未经授权的访问&#xff0c;也显著降低了来自外部或内部威胁的风险。以下是网…

每天一个数据分析题(四百)- 一元线性回归模型

评价一元线性回归模型拟合程度时&#xff0c;主要根据&#xff08; &#xff09;的数值 A. 相关系数 B. R2 C. SSE D. SSR 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xff0c;SQL&…

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的&#xff0c;商家给的资料中首先让配置网口&#xff0c;但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达&#xff0c;但wireshark可以正常抓到数…

PyPDF2拆分PDF文件的高级应用:指定拆分方式

本文目录 前言一、拆分方式选择1、代码讲解2、实现效果图3、完整代码前言 前两篇文章,分别讲解了将使用PyPDF2将PDF文档分割成为单个页面、在分割PDF文档时指定只分割出指定页面,如果你还没有看过,然后有需要的话,可以去看一下,我把文章链接贴到这里: PyPDF2拆分PDF文件…

Nuxt3 的生命周期和钩子函数(九)

title: Nuxt3 的生命周期和钩子函数&#xff08;九&#xff09; date: 2024/7/3 updated: 2024/7/3 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt3中与Vite相关的五个生命周期钩子&#xff0c;包括vite:extend、vite:extendConfig、vite:configResolved、vite…

CVE-2024-6387漏洞预警:尽快升级OpenSSH

OpenSSH维护者发布了安全更新&#xff0c;其中包含一个严重的安全漏洞&#xff0c;该漏洞可能导致在基于glibc的Linux系统中使用root权限执行未经身份验证的远程代码。该漏洞的代号为regreSSHion&#xff0c;CVE标识符为CVE-2024-6387。它驻留在OpenSSH服务器组件&#xff08;也…

双阶段目标检测算法:精确与效率的博弈

双阶段目标检测算法&#xff1a;精确与效率的博弈 目标检测是计算机视觉领域的一个核心任务&#xff0c;它涉及在图像或视频中识别和定位多个对象。双阶段目标检测算法是一种特殊的目标检测方法&#xff0c;它通过两个阶段来提高检测的准确性。本文将详细介绍双阶段目标检测算…

小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…

纯语义,再也不用写css了

Mojo CSS 是一个下一代的原子级 CSS 框架&#xff0c;由 Mohammad Zamanian 和 Ali Mirabbasi 开发和维护&#xff0c;于2023年发布。这个框架的核心特性在于它能够自动扫描你的HTML代码&#xff0c;并根据这些代码实时生成对应的CSS视觉效果&#xff0c;这意味着开发者无需手动…