剑指offer里的递归与循环

手把手教你用certificate-manager修复Vcenter证书过期问题(附密码重置技巧) 本文详细解析了Vcenter证书过期引发的503服务不可用、密码错误等典型故障现象,并提供了使用certificate-manager工具进行系统性修复的完整步骤。文章重点阐述了证书体系原理、精准诊断方法,并分享了在SSO验证失败时通过vdcadmintool重置密码的关键技巧,帮助管理员快速恢复平台并建立预防性运维策略。 阅读详情

其实这是第二遍刷剑指offer,发现已经忘得差不多了…虽然说有印象,但该不会写还是不会写。果然纯粹为刷题而刷题,完全不总结还是没啥用啊。所以这次根据题号顺序对里面的算法思想做个总结。

递归怎么解

对于算法ruo ji来说真的很不愿意用递归…因为绕来绕去一定会把自己绕进去。在平时写题时能不用就不用,宁愿写个超级复杂的循环也不想用递归。
但是…!在一定场景下递归真的很简洁很容易。比如这道

根据前序中序序列重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

在草稿纸上画了一通,已经明确核心思想:

  1. 每次取出前序遍历序列的第一个数作为根节点,找出它在中序序列的位置,
    即let index = vin.indexOf(pre[0]);。
    且下一次递归的前序序列也会根据中序序列中的节点数被分成两半。一半是pre.slice(1, index + 1),一半是pre.slice(index + 1)

  2. 以这个数为分界点,将中序遍历序列分为两半。前半部分为左子树,后半部分为右子树。
    即let left = vin.slice(0, index);和let right = vin.slice(index + 1);

明确之后,感觉要用递归,但还是试试循环求解。若是循环,每次拆解中序序列时会非常麻烦,因为会产生很多的零碎序列片段。

所以应该使用递归,但每次递归产生的结果是什么?应该返回什么?这个是递归的重点。根据题目,既然最后的结果应该是一颗完整的数,所以递归结果即return的内容一定是一个含有val,左右节点的树节点。

即

//返回值是一个节点,已经包括其左右子树
return {
    val: pre[0],
    left: reConstructBinaryTree(pre.slice(1, index + 1), left),
    right: reConstructBinaryTree(pre.slice(index + 1), right)
}

根据这道题,会发现其实递归的难点并不在于算法,而在于对每次递归产生的结果及返回值的把握,一定要搞清楚返回值到底是什么。

还有剑指offer里的第三题也是关于递归的,不过跟这道题思想有点不一样。

从尾到头打印链表

  • 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

当然可以无脑循环+unshift,不过估计面试可以直接结束了

如果要用递归的话,明确下一次递归应该是这次递归头结点的next节点,但还是一直卡在应该返回什么。很容易知道如果递归到最后尾节点时可以直接返回值不用递归了。所以应该分界讨论其返回值

  • 如果不是最后节点,那这次循环得到的结果应该是一个尾节点到head.next的结果数组
  • 如果是尾节点,这才是最开始,将其直接push进数组即可。
//递归,
let res = [];
if(head) {
    if(head.next) {
        res = printListFromTailToHead(head.next);
        //若不是最后节点
        //这个函数返回的应该已经是一个从尾到头的结果数组
    }
    res.push(head.val);
    //若是最后节点
    //直接将其置加入数组
}
return res;

…还有一个神级看不懂的递归方法,求解

if(head){
    printListFromTailToHead(head.next);
    res.unshift(head.val);
}
return res;

递归产生的问题

虽然说递归看上去很厉害很万能,但有时递归会产生非常多的重复计算造成时间复杂度非常大。例如经典的Fibonacci数列。

Fibonacci数列

虽然一句return Fibonacci(n-1) + Fibonacci(n-1)就可以解决,但这样效率非常低,面试时这么写肯定是拿不到offer了

不用递归就只能用循环了,整体只用记录三个数即可

function Fibonacci(n) {
    let pre = 0, cur = 1,res;
    if(n === 0) return pre;
    if(n === 1) return cur;
    for(let i = 2; i<=n; i++) {
        res = pre + cur;
        pre = cur;
        cur = res;
    }
    return res;
}

跳台阶

  • 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

对于每次情况,不然就跳1级,不然就跳2级,只有这两种情况,且对于n级台阶跳法有f(n)种。

  1. 如果这次跳1级,还剩下n-1级台阶要跳,即跳法是f(n-1)
  2. 如果这次跳2级,还剩下n-2级台阶要跳,即跳法是f(n-2)
  3. 结合前面两种,即f(n) = f(n-1) + f(n-2),本质是一个斐波那契数列,且f(1) = 1, f(2) = 2

变态跳台阶

  • 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

与上题很像,对于每次情况:

  1. 跳1级,剩下跳法f(n-1)
  2. 跳2级,剩下跳法f(n-2)
  3. 跳3级,剩下跳法f(n-3)
    …
  • 跳n-1级,剩下跳法f(1)
    所以f(n) = f(1) + f(2) + f(3) + … + f(n-1),且f(1) = 1, f(2) = 2
    也可以理解成,每增加1级,跳法翻倍(因为每次都前一个数加两遍)
function jumpFloorII(number)
{
    // write code here
    let res = 1;
    if(number === 1) return res;
    for(let i = 2; i <=number; i++) {
        res = res*2;
    }
    return res;
}

同样可以用递归来做,这里的递归跟循环基本上一致。

function JumpFloorII(number) {
    if(target === 1) {
        return 1;
    } else {
        return 2* JumpFloorII(target);
    }
}

总结

整体来说,递归对于很多复杂的算法题非常有帮助,但在使用递归的同时需要注意其算法复杂度是否太大。并且递归对我的一个最大难点就是:

  • 递归的返回值与递归状态之间的关系

可以

  • *模拟递归到底时的情况,
  • 明确每一次递归产生的结果是什么,
  • 不同次数递归之间的关系。
深度学习batch、batch_size、epoch、iteration以及小样本中episode、support set、query set关系 训练整个数据集是epoch、把数据集分为多少小块就是batch,每个小块(batch)多少个数据就是batch_size,整个数据集需要训练多少轮是iteration 阅读详情

相关推荐

Apple CarPlay Certification Guide December 2022 解析V1.0

Apple CarPlay Certification Guide December 2022更新说明

m0_74450450的博客 703

如何将递归转换为循环

动机 递归效率没有循环高,有额外的方法调用开销 堆栈溢出(stackoverflow) 递归有时挺难理解(不过很多算法用递归最容易实现) 直接法 首先找到递归的结束条件,并且每次递归调用肯定是逼近结束条件(Base Case) 实现一个相同结束条件的循环,每次循环逼近结束条件 public class CountDown { public void countDown(int n) { if(n == 0) return; System.out.println(n + "...");

bill的博客 2840

产品必备技能(十):如何绘制原型图?先要绘制页面流程图+页面原型图!附实操原型图、流程图实例(抖音)

文章目录目标题目实操步骤模板实操【抖音】APP的视频发布功能页面流程绘制页面流程图合格标准绘制页面原型图合格标准 目标 新入行的产品经理都对原型抱有向往的心境,但是有经验的产品经理不会一上来就画原型,而是先画页面流程再来画原型。通过学习,你将学会如何用页面流程图规划用户行为路径、如何借助原型识别问题、减少风险、有效沟通。 题目 任意选择一款你喜欢的产品,体验某个功能,下载并梳理此功能至少5个以上的页面流程跳转点(后面会解释),还原2 - 3个主要界面的低保真原型图。 实操步骤 可使用手绘以及Process

汪雯琦的博客 4842

【算法思维训练-剑指Offer联名 二】递归与循环篇

本篇是联名训练的第二篇,主题为递归与循环,如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归是在一个函数的内部调用这个函数自身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。 递归与循环 循环很常见,就是for、while、do while这样子,我们平时使用的也较为频繁,我们重点关注下递归的优缺点: 优点:代码简洁。基于递归实现的代码比基于循环实现的代码要简洁很多,更加容易实现。 缺点一:效率较低。递归由于是函数调用自身,而函数调用是有时间和空间的消耗

MaoLin Tian's Blog 874

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 881

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1970

剑指offer-递归系列问题

这篇讲述的是剑指offer上的递归使用的问题,包括斐波那契数列、跳台阶以及它的进阶版变态跳台阶问题 斐波那契数列 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 class Solution { public: int Fibonacci(int n) { int f1=1,f2=1; ...

lazymanxxx的博客 261

宇树机器人G1二次开发:语音对话、打断与激活功能实现指南

宇树机器人G1是一款功能强大的四足机器人,其开放的SDK和API为开发者提供了广阔的二次开发空间。其中,语音交互是提升机器人智能化水平和用户体验的关键功能。本文将详细介绍如何在宇树机器人G1上进行二次开发,实现。语音打断允许用户在机器人说话时随时中断并输入新指令,这是提升交互自然度的关键功能。三大核心功能,帮助你构建更自然、更智能的人机交互系统。语音识别是将用户的语音输入转换为文本的过程。识别文本后,需要理解用户意图并生成回复。将文本回复转换为语音输出。

m0_52645558的博客 664

剑指Offer----递归-----Python

尊重知识产权:掘金---程序员吴师兄: 看动画轻松理解「递归」与「动态规划」人们往往习惯了平铺直叙的思维方式,所以递归与动态规划这种带循环概念的比较绕,相对难理解。什么是递归先下定义:递归算法是一种直接或者间接调用自身函数或者方法的算法。通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。它有如下特点:一个问题的解可以分解为几个子问题的解这个问题与分解...

weixin_30432179的博客 188

libVLC 视频抓图

libVLC 中通过libvlc_video_take_snapshot核心接口来截图。以下是VLC播放器中使用的截图界面,我们仿照这个做一个界面。首先,你需要初始化 libVLC 实例和媒体播放器对象。1. 初始化 libVLC 和媒体播放器。菜单添加action,并响应槽函数。生成目录下snap.png。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1941

《RT-Thread入门与实战》第1章:RT-Thread概述与核心优势

2006年由熊谱翔发起2017年成立上海睿赛德电子科技公司2021年成为国内首个通过ISO 26262 ASIL-D认证的RTOS。

2301_79143213的博客 986

《剑指Offer》递归和循环算法

本文以《剑指Offer》中的题目第七题至第十题为例,做递归和循环算法的笔记记录。 目录 第七题-斐波那契数列 第八题-跳台阶 第九题-变态跳台阶 第十题-矩阵覆盖 第七题-斐波那契数列 题目描述如下: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)n<=39。 思路: 斐波那契数列:1, 1, 2, 3, 5, 8...

长林攻城狮的博客 255

使用GeoServer发布WMS动态地图服务,使用openlayers访问wms服务浏览地图数据

GEOServer是java版开源工具,使用GEOServer简单几步就可以搭建自己的地图服务,与小伙伴们共享地图数据。 一、使用GEOServer发布WMS动态地图服务 大致步骤如下: 1. 新建工作区 左边菜单栏,工作区,新建,起个名字,设置url。 2. 选择数据源 左边菜单栏,选择“数据源”,点击“添加新的数据源”,常用的有shp、postgresql数据库,根据自己的需要选择,这里选择了shp文件源。 选中存放在刚才新建的工作区下面,给数据源起个名字,选择文件本机存放位置,设置编码,包含中文属

从地图看世界的专栏 4540

《剑指Offer》解题目录(更新完毕)

题目来源于LeetCode上的《剑指Offer》,这里做一个目录方便大家查找。另外有本人的LeetCode解题目录、《程序员面试金典》可点击链接查看。

Michael是个半路程序员 6160

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

力扣【剑指offer】题目汇总与总结

本文为《剑指offer》刷题笔记的总结,花费不到两个月的时间将力扣上《剑指offer》的75道题刷了一遍,遇到不会的知识点或者应该做一些记录的题目都将其写在了往日的博客里。 整体来看,这75道题,涉及到常用的数据结构:数组、字符串、链表、栈、队列、树、图,还有一些常用的数据操作和算法:二分法、哈希表、递归、排序、查找、位运算、动态规划、回溯、滑动窗口、双指针、深度优先搜素(DFS)、贪心。 1、数组 (1)剑指offer03.数组中重复的数字。 (2)剑指offer04.二维数组中的查找。解法:找标

华辰烟雨的博客 6万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《剑指offer》详解-Python

问题3:二维数组中的查找 Q: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 A1:遍历整个二维数组,O(n2)O(n^2)O(n2) A2: 从左上或者右下开始查找。从右上开始查找:如果数组中的数比这个整数大,向左移动一位,如果数组中的数比这个数小,...

林夕 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

剑指offer刷题汇总

前言      从今天开始在牛客刷剑指offer,希望每天打卡几个算法,提高自己的编程水平。在优快云做一下记录,随时更新,一起学习吧。 目录大全 数组 剑指offer ( 一 ):二维数组中的查找 剑指offer ( 六 ):旋转数组的最小数字 剑指offer ( 十三 ):调整数组顺序使奇数位于偶数前面【代码完整性】 剑指offer(二十八):数组中出现次数超过一半的数字【 时间效率】...

守得云开见月明 5825

《剑指offer》—— 递归和循环

  记录一下牛客网上,剑指 offer 分区的考点为“递归和循环”的题,都很简单,共 4 题:   1、斐波那契数列   2、跳台阶   3、变态跳台阶   4、矩形覆盖 1、斐波那契数列   大家都知道斐波那契数列,现在要求输入一个整数 n,请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。(n &amp;amp;lt;= 39)   循环方式: int Fibonacci(int n...

Bob__yuan的博客 253

剑指offer刷题顺序

数组(共12道题目): 【剑指Offer】1、二维数组中的查找 【剑指Offer】6、旋转数组的最小数字 【剑指Offer】13、调整数组顺序使奇数位于偶数前面 【剑指Offer】19、顺时针打印矩阵 【剑指Offer】28、数组中出现次数超过一半的数字 【剑指Offer】30、连续子数组的最大和 【剑指Offer】32、把数组排成最小的数 【剑指Offer】35、数组中的逆序对 【剑指Offer】37、数字在排序数组中出现的次数 【剑指Offer】40、数组中只出现过一次的数字 【剑

sunjingze1的博客 2434

剑指offer递归的题

递归目录前情提要正则表达式匹配斐波那契数列矩形覆盖跳台阶变态跳台阶 前情提要 刚刷完牛客网的剑指offer,写个博客对自己的一个总结。第一次刷,很多题只会暴力破解,我把做每道题的个人思路和他人思路用java进行了编写,如果在这篇文章找不到可以试试看看别的区域,因为很多的树的题都是用递归进行做的,我把其归在了树里面。希望自己的博客能对大家有帮助,准备下一个开leetcode hot100题的坑了。 ...

weixin_41692832的博客 360

《剑指offer》解题笔记

《剑指offer》解题笔记 《剑指offer》共50题,这两周使用C++花时间做了一遍,谨在此把一些很巧妙的方法、写代码遇到的难点、易犯错的细节等做一个简单的标注,但不会太过详细,具体算法还是请参考书本。 做的比较急,代码还有很多不完善的地方,如有错误,欢迎改正,地址为:github:sword_of_offer。可以使用git clone https://github.com/heL

Focustc 8148

剑指Offer 67题 C++题解

从2月底开始找工作,到今天,经历了两个月的时间终于得到了百度的offer。今年除去疫情影响的因素,春招难度确实很大。还要加强 代码能力 和 基础能力 。 剑指Offer 67题题解,C++版。从今天开始我会重新在做一遍,整理出完整的 题解思路 以及 AC代码 。 题解完成情况:0/67。 文章目录1.题目(1) 二维数组中的查找(2) 替换空格2.更新日志 1.题目 (1) 二维数组中的查...

x_mn的博客 1780

【剑指offer】递归循环两种方式反转链表

本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上测试了非递归版本,AC。 题目描述: 输入一个链表,反转链表后,输出链表的所有元素。 (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。 输出: 对应每个测试案例, 以此输出链表反转后的元素,如没有元素则输出NULL。 样例输入:

兰亭风雨的专栏 7614

用递归代替循环嵌套算法思想

问题引入:输出2位数字的所有排列组合 对于这个问题我们很快可以想出解决方案: for(int i = 0;i<10;i++){ for(int j = 0;j<10;j++){ System.out.println(i+""+j); } } 那要是输出3位数字的排列组合呢?你可能会想那就多套一层循...

qq_42862882的博客 2124

《剑指Offer》 递归总结篇

  反向遍历链表 翻转链表 合并两个排序的链表 0、基础 基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。 最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。 【A】----依赖----&gt;【B】----依赖----&gt;【C】 ...

try_again_later的博客 355

剑指offer题目描述+代码

1、剑指Offer 25:合并两个有序链表 题目描述 解题思路 通过不断对比l1和l2的值的大小对链表进行添加。 代码实现 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1: ListNode,

JJJJJJames的博客 1772
上一篇: JavaScript的执行机制——同步与异步、事件循环、微任务与宏任务
下一篇: 微信小程序添加插屏广告并设置显示频率(一天一次)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值