递归 算法

递归、搜索与回溯算法

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

1. 汉诺塔

题目链接: 面试题 08.06. 汉诺塔问题

解题思路:

  1. 首先观察有一个、两个、三个盘子时的情况,手动去挪
  2. 不难发现,大致都是先将上面n-1个盘子借助C的辅助,挪动到B柱子上;再将剩下的那个盘子从A柱子挪动C柱子;最后将B柱子上的n-1个盘子通过A的辅助,挪动到C柱子上

实现代码:

class Solution {public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {move(A, B, C, A.size());}private void move(List<Integer> start, List<Integer> temp, List<Integer> end, int n) {if(n == 1) {move(start, end);return;}move(start, end, temp, n-1);move(start, end);move(temp, start, end, n-1);}private void move(List<Integer> start, List<Integer> end) {int val = start.remove(start.size()-1);//注意这里是start.remove(start.size()-1),不能是start.remove(0)end.add(val);}
}

注:

  • 在move方法中,如果传三个参数,第一个参数代表起始柱子,第二个参数代表辅助柱子,第三个参数代表目标柱子;如果传两个参数,第一个参数代表起始柱子,第二个参数代表目标柱子

2. 合并两个有序链表

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

这道题在链表那一节已经写过了,现在如果用递归去实现,该怎么写呢?

首先,解决一个递归问题的思路就是找出重复的子问题,据此可以设计出函数头;然后,只关心某一个子问题在做什么->函数体的设计;最后,递归的出口

  1. 比较list1的val值和list2的val值,较小值对应的指针往前走,较大值对应的指针保持不动
  2. 较小指针的next = 合并两个指针后面的子有序链表,重复1操作,直至有指针走完整个链表

实现代码:

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1 == null) {return list2;}if(list2 == null) {return list1;}int val1 = list1.val;int val2 = list2.val;if(val1 < val2) {list1.next = mergeTwoLists(list1.next, list2);return list1;}else {list2.next = mergeTwoLists(list1, list2.next);return list2;}}
}

3. 反转链表

题目链接:206. 反转链表

这道题在前面也同样做过,现在用递归来实现,下面用两个不同的视角来看待,本质上,两者都是一样的,只是第二种视角是第一种视角的展开

  1. 宏观视角

在这里插入图片描述
先当前节点后面的节点逆置,再把当前节点连接到逆置后的链表后面

  1. 把链表看作一个单分支的树

在这里插入图片描述
因此,想要逆置这个链表,可以采用后续遍历的思想

实现代码:

class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) return head;ListNode newHead = reverseList(head.next);//newHead标记逆置后的链表的头节点head.next.next = head;head.next = null;return newHead;}
}

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

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

实现代码:

class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) {return head;}ListNode newHead = head.next;head.next = swapPairs(newHead.next);newHead.next = head;return newHead;}
}

5. Pow(x,n)-快速幂

题目链接:50. Pow(x, n)

这题如果用暴力求解,时间成本会很高。换个角度,当我们求解xn时,我们可以先求出x n/2,再去求解x n;当我们需要求解x n/2时,我们可以先求出x n/4的值,再去求解x n/2

算法思路

  1. 根据子问题来设计出函数头:函数头需要两个参数,底数和指数,返回值为double类型
  2. 只关心某一个子问题做了什么,设计函数体:先求出x n/2等于多少,然后再根据n的奇偶性,得出x n等于多少
  3. 递归的出口:当n等于0时,返回1

实现代码:

class Solution {public double myPow(double x, int n) {//如果n小于0,则结果等于当指数为-n时结果的倒数return n >= 0 ? pow(x, n) : 1.0 / pow(x, -n);}private double pow(double x, long n) {if(n == 0) return 1.0;double tmp = pow(x, n / 2);//如果n是偶数,x ^ n 等于 x ^ n/2 * x ^ n/2 ;//如果n是奇数,x x ^ n 等于 x ^ n/2 * x ^ n/2 * nreturn n % 2 == 0 ? tmp * tmp : tmp * tmp * x;}
}

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

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

相关文章

深度学习常用指标

1. 混淆矩阵&#xff08;误差矩阵&#xff09; 2. 准确率&#xff08;overall accuracy&#xff09; 代表了所有预测正确的样本占所有预测样本总数的比例 这里分类正确代表了正样本被正确分类为正样本&#xff0c;负样本被正确分类为负样本 3. 平均精度&#xff08;average…

BERT的中文问答系统50

我们将对BERT的中文问答系统48-1代码进行以下改进: 1.增加时间日期和日历功能:在GUI中增加显示当前时间和日期的功能,并提供一个日历组件。 2.增加更多模型类型:增加娱乐、电脑、军事、汽车、植物、科技、历史(朝代、皇帝)、名人、生活(出行、菜品、菜谱、居家),法律、…

黑马JavaWeb-day06、07、08(SQL部分) _

文章目录 MYSQL概述数据模型SQL简介SQL分类 DDL数据库操作表操作 DML增&#xff08;INSERT&#xff09;改&#xff08;UPDATE&#xff09;删&#xff08;DELETE&#xff09; DQL基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询…

浏览器同源策略、跨域、跨域请求,服务器处理没、跨域解决方案

目录 什么是同源策略什么是跨域发生跨域时&#xff0c;服务器有没有接到请求并处理响应&#xff1a;&#xff08;两种情况&#xff09; 如何解决跨域 什么是同源策略 概念&#xff1a; 同源策略是浏览器的一种安全机制&#xff0c;用于防止恶意网站对用户的敏感数据进行未经授…

D87【python 接口自动化学习】- pytest基础用法

day87 pytest运行参数 -m -k 学习日期&#xff1a;20241203 学习目标&#xff1a;pytest基础用法 -- pytest运行参数-m -k 学习笔记&#xff1a; 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例&#xff0c;markers最好使用英文 [pytest] testpaths./te…

【嘟嘟早教卡】 小程序源码分享带后台管理

【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成&#xff0c;后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片&#xff0c;基本大部分家庭都买过认知卡片&#xff0c;我按照…

数据分析学习

数据分析的定义 数据分析是通过对收集到的数据进行清理、转换、建模、分析和解释&#xff0c;从中提取有用的信息和洞察&#xff0c;以帮助做出更好的决策。数据分析可以应用于各种领域&#xff0c;比如商业、金融、医疗、市场营销等&#xff0c;目的是通过数据来发现模式、趋…

Python几种常用数据结构(重制版)

一、列表 [List] 定义&#xff1a;有序可重复的数据集合。示例&#xff1a;my_list [element1, element2, element3]增加元素方法&#xff1a; append()&#xff1a;在列表末尾增加单个元素&#xff08;列表特有方法&#xff09;&#xff0c;例如 my_list.append(element)。e…

黑马微服务开发与实战学习笔记_MybatisPlus_P1介绍与快速入门

系列博客目录 文章目录 系列博客目录MybatisPlus介绍快速入门Part1:入门案例Part1.1:MyBatis项目Part1.2:实现MP Part2:常见注解Part2.1:约定Part2.2:常见注解 Part3:常见配置MyBatisPlus使用的基本流程是什么? MybatisPlus介绍 在Mybatis上加了Plus&#xff0c;表示对Mybati…

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质&#xff08;Materials&#xff09; 定义了场景中对象的表面属性&#xff0c;包括颜色、金属度、粗糙度、透明度等等&#xff1b;可以在材质编辑器中可视化地创建和编辑材质&#xff1b;虚幻引擎的渲染管线的着色器是用高级着色语言&#xff08;…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解&#xff0c;每一步都十分的细致&#xff0c;如果你感兴趣希望多多点赞收藏关注支持 简介&#xff1a;文章对爬虫展开多方面剖析。起始于爬虫的基本概念&#xff0c;即依特定规则在网络抓取信息的程序或脚本&#xff0c;在搜索引擎信息提取上作…

vue 项目实现阻止浏览器记住密码

​在各个浏览器中&#xff0c;登录输入密码一般都会弹出是否记住密码的功能&#xff0c;如果记住之后&#xff0c;会在各个密码框自动填充记住的密码&#xff0c;这无疑是一种不安全的操作&#xff0c;所以要实现禁用阻止浏览器记住密码的行为 查阅资料&#xff0c;也得到很多…

Y20030028 JAVA+SSM+MYSQL+LW+基于JAVA的考研监督互助系统的设计与实现 源代码 配置 文档

基于JAVA的考研监督互助系统 1.项目描述2. 课题开发背景及意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着高等教育的普及和就业竞争的加剧&#xff0c;越来越多的学生选择继续深造&#xff0c;参加研究生入学考试。考研人数的不断增加&#xff0c;使得考研过程中的学习监…

【AI系统】推理流程全景

推理流程全景 本文介绍神经网络模型在部署态中的两种方式&#xff1a;云侧部署和边缘侧部署。其中&#xff0c;云侧部署适用于云服务器等具备强大计算能力和存储空间的环境&#xff0c;可以实现高吞吐量和集中的数据管理&#xff0c;但可能面临高成本、网络延迟和数据隐私等挑…

9.13[debug]

这个错误表明 Git 尝试通过 HTTPS 协议连接到 Gitee 上的仓库时&#xff0c;实际上却尝试连接到了本地的 127.0.0.1&#xff08;即 localhost&#xff09;的 7890 端口&#xff0c;这通常是因为 HTTP 代理配置错误或全局 Git 配置中的代理设置不正确 如果这些命令返回了代理设…

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…

【Linux】用户操作命令

声明&#xff1a;以下内容均学习自《Linux就该这么学》一书 1、管理员root Linux系统的管理员之所以是root&#xff0c;并不是因为它的名字叫root&#xff0c;而是因为该用户的身份号码UID&#xff08;User IDentification&#xff09;的数值是0。UID相当于身份证号码&#x…

Altium Designer学习笔记 28 扇孔处理

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

XiYan-SQL:⼀种多⽣成器集成的Text-to-SQL框架

发布于:2024 年 12 月 03 日 星期二 北京 #NL2SQL #阿里巴巴 #Text-to-SQL 文提出了一种用于自然语言到 SQL 转换的多生成器集成框架 ——XiYan-SQL,旨在应对大型语言模型在 NL2SQL 任务中的挑战。该框架融合提示工程与监督微调(SFT)方法,利用 SFT 的可控性与上下文学习(…

插入算法介绍(c基础)

介绍一下希尔排序法(c基础)-CSDN博客 一、插入算法概述 定义 插入算法是一种常见的排序算法&#xff0c;它的基本思想是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。适用场景 插入算法适用于数据量较小…