【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盘内的…

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…

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

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

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

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

大陆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;也…

小型语言模型的兴起

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

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址&#xff1a; GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…

Laravel介绍与学习入门

Laravel 是一款优雅且功能强大的 PHP Web 开发框架&#xff0c;它被广泛认为是 PHP 领域内构建现代 Web 应用程序的最佳选择之一。Laravel 提供了一套简洁、富有表现力的语法&#xff0c;使得开发者能够高效地编写清晰、可维护的代码。以下是 Laravel 的一些关键特点和入门概念…

实战项目——用Java实现图书管理系统

前言 首先既然是管理系统&#xff0c;那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种&#xff0c;一个是管理员&#xff0c;另一个是普通用户&#xff0c;既如此&#xff0c;可以定义一个用户类&#xff08;user&#xff09;&#xff0c;在定义管理员类&am…

DMA学习笔记

参考文章 https://blog.csdn.net/as480133937/article/details/104927922 DMA简介 DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。DMAC 即 DMA 控制器&#xff0c;提供了一种硬件的数据传输方式&#xff0c;无需 CPU 的介入&#xff0c;可以处理外…

7.6、指针和数组

代码 #include <iostream> using namespace std;int main() {//指针和数组//利用指针访问数组中的元素int arr[10] { 1,2,3,4,5,6,7,8,9,10 };cout << "第一个元素为&#xff1a;" << arr[0] << endl;int * p arr;//arr就是数组首地址co…

kaggle量化赛金牌方案(第七名解决方案)(下)

— 无特征工程的神经网络模型&#xff08;得分 5.34X&#xff09; 比赛进入最后阶段&#xff0c;现在是时候深入了解一些关于神经网络模型的见解了。由于 Kaggle 讨论区的需求&#xff0c;我在这里分享两个神经网络模型。第一个是 LSTM 模型&#xff0c;第二个是卷积网络&…