【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

x264 编码器汇编模块介绍

aarch64汇编架构 解释:AArch64 是 ARM 架构的 64 位版本,也称为 ARMv8-A特点: 64位寻址能力,支持更大的地址空间,理论上可达16EB(Exabyte)使用64位宽的寄存器,有31个通用寄存器(X0-X30),外加一个链接寄存器(X31)支持扩展的 NEON SIMD 指令集,提供更多的执行单元和…

慧哥Saas充电桩开源平台 V2.5.5

文章目录 原地址&#xff1a;https://gitee.com/chouleng/cdzkjjh&#xff0c;更换新的地址如下 [点击此链接 https://gitee.com/chouleng/huili-cloud](https://gitee.com/chouleng/huili-cloud)一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端…

Java 虚拟机 一

运行时数据区 我们先看线程隔离的数据区 程序计数器 程序计数器&#xff08; Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c; 它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执…

cesium方案论证实现功能

仓库地址&#xff1a;Harvey-Andrew 演示地址&#xff1a;哔哩哔哩-满分观察网友z 文章目录 1. 场景加载2. 3D 模型2.1. 坐标转换2.2. 放置模型2.3. 调整模型2.4. 提交方案 3. 查看方案3.1. 场景还原3.2. 删除 1. 场景加载 加载Cesium的Melbourne Photogrammetry的倾斜摄影作…

【Kafka】记录一次Kafka消费者重复消费问题

文章目录 现象业务背景排查过程Push与Pull 现象 用户反馈消费者出现消息积压&#xff0c;并且通过日志看&#xff0c;一直重复消费&#xff0c;且没有报错日志。 业务背景 用户的消费者是一个将文件做Embedding的任务&#xff0c;&#xff08;由于AI技术的兴起&#xff0c;大…

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为&#xff1a; Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE

Qt开发 | qss简介与应用

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用&#xff1a;实时打开关闭状态按钮五、QComboBo…

Docker部署ETCD 3.5.14(保姆级图文教程)

系列文章目录 Docker部署Nginx 1.21.5&#xff08;保姆级图文教程&#xff09; Docker部署MySQL 8.3.0&#xff08;保姆级图文教程&#xff09; Docker部署ETCD 3.5.14&#xff08;保姆级图文教程&#xff09; 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 ETCD 镜像…

解决前端登录成功之后,往后端发请求携带cookie问题

项目背景&#xff1a; 今天在做伙伴匹配系统&#xff1a; 我现在实现的功能是&#xff1a; 在我登录成功之后&#xff0c;就进入了主页&#xff08;默认页&#xff09;&#xff0c;在我访问用户页的时候产生的问题 首先说明一下这个Cookie的问题&#xff1a; 我们登录成功…

StarRocks 3.3 重磅发布,Lakehouse 架构发展进入快车道!

StarRocks 3.3 的发布标志着 Lakehouse 架构在数据分析领域迈向了一个新的高度。作为下一代 Lakehouse 架构的代表&#xff0c;StarRocks 3.3 在稳定性、计算性能、缓存设计、物化视图、存储优化和 Lakehouse 生态系统等方面进行了全方位的优化和创新。本文将逐一介绍 StarRock…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作&#xff0c;按照规定的维护服务要求&#xff0c;外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…

诠释长期主义内核,紧抓阶段发展机遇,哪吒汽车迎来IPO新纪元

6月26日&#xff0c;合众新能源汽车股份有限公司(下称“合众新能源”或“哪吒汽车”)向港交所递交上市申请&#xff0c;中金公司、摩根士丹利、中信证券、农银国际及招银国际为其联席保荐人。 自品牌成立以来&#xff0c;哪吒汽车便秉持“科技平权”的价值理念&#xff0c;潜心…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作&#xff1f; 在网络和互联网协议领域&#xff0c;有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具&#xff0c;它代表套接字安全版本 5。 在这篇博文中&#xff0c;我们将深入探讨 SOCKS5 的细节&…

如何在TechNow招聘顶尖AI工程师

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

实用麦克风话筒音频放大器电路设计和电路图

设计目标 输入电压最大值输出电压最大值电源Vcc电源Vee频率响应偏差20Hz频率响应偏差20kHz100dB SPL(2Pa)1.228Vrms5V0V–0.5dB–0.1dB 设计说明 此电路使用跨阻抗放大器配置中的运算放大器将驻极体炭精盒麦克风的输出电流转换为输出电压。此电路的共模电压是固定的&#xf…

MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)

目录 一、动态SQL 常用的动态SQL 元素 二、if元素 三、choose 、when 、otherwise 元素 四、trim 、where 、set 元素 trim&#xff08;不常用&#xff09; where set 五、foreach 元素 六、bind 元素 #{} ${} 区别 示例完整代码 七、映射器注解 八、基本注解 …

代码随想录算符训练营第1天|LeetCode704二分查找,LeetCode27移除元素

704.二分查找 题目链接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

STMF4学习笔记(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…