算法练习-递归

news/2024/4/26 8:20:54/文章来源:https://blog.csdn.net/weixin_62759952/article/details/129224687

算法练习-递归

文章目录

  • 算法练习-递归
    • 1 解题技巧
      • 1.1 如何发现问题可以用递归来做
      • 1.2编写递归的正确姿势
    • 2 爬楼梯
      • 2.1 题目
      • 2.2 题解
    • 3 细胞分裂
      • 3.1 题目
      • 3.2 题解
    • 4 从尾到头打印链表
      • 4.1 题目
      • 4.2 题解
    • 5 剑指 Offer 10- I. 斐波那契数列
      • 5.1 题目
      • 5.2 题解
    • 6 剑指 Offer 10- II. 青蛙跳台阶问题
      • 6.1 题目
      • 6.2 题解
    • 7 三步问题
      • 7.1 题目
      • 7.2 题解
        • 7.2.1 递归(可能会超时)
        • 7.2.2 非递归
        • 7.2.3 非递归+优化(内存优化)
    • 8 剑指 Offer 16. 数值的整数次方
      • 8.1 题目
      • 8.2 题解
    • 9 递归乘法
      • 9.1 题目
      • 9.2 题解

1 解题技巧

1.1 如何发现问题可以用递归来做

  • 规模更小的问题和规模更大的问题,解题思路相同,规模不同
  • 利用子问题可以组合得到原问题的解
  • 存在最小子问题,可以直接返回结果(存在递归终止条件)

1.2编写递归的正确姿势

可以假设子问题B、C已经解决,在此基础上再思考如何解决问题A

2 爬楼梯

链接:https://leetcode.cn/problems/climbing-stairs

2.1 题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

2.2 题解

class Solution {private int[] m;public int climbStairs(int n) {m = new int[n + 1];return f(n);}private int f(int n) {if (n == 1) {return 1;}if (n == 2) {return 2;}if (m[n] != 0) {return m[n];}m[n] = f(n - 1) + f(n - 2);return m[n];}
}

3 细胞分裂

3.1 题目

一个细胞的生命周期是3小时,1小时分裂一次,求n小时后容器内有多少个细胞。

细胞会在每个小时的开始分裂、死亡,并且先分裂后死亡

3.2 题解

当前时间细胞总数 = 分裂后的个数 - 死亡个数

f(n) = 2 * f(n - 1) - f(n - 4)

当前时间点,死亡的细胞个数,为三个小时前分裂出的净细胞个数,

而一个时间点分裂出来的净细胞个数等于前一个时间点的细胞个数

所以死亡个数为f(n - 4)

public int f(int n) {if (n == 0) return 1;if (n == 1) return 2;if (n == 2) return 4;if (n == 3) return 8;return 2 * f(n - 1) - f(n - 4);
}

4 从尾到头打印链表

链接:剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode)

4.1 题目

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

4.2 题解

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {List<Integer> result = new ArrayList<>();public int[] reversePrint(ListNode head) {reverse(head);int[] resultArr = new int[result.size()];int i = 0;for (Integer j : result) {resultArr[i++] = j;}return resultArr;}public void reverse(ListNode head) {if (head == null) {return;}reverse(head.next);result.add(head.val);}
}

5 剑指 Offer 10- I. 斐波那契数列

链接:https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof

5.1 题目

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1
示例 2:

输入:n = 5
输出:5

5.2 题解

class Solution {int mod = 1000000007;int[] m;public int fib(int n) {m = new int[n + 1];return f(n);}private int f(int n) {if (n == 0) return 0;if (n == 1) return 1;if (m[n] != 0) return m[n];m[n] = (f(n - 1) + f(n - 2)) % mod;return m[n];}
}

6 剑指 Offer 10- II. 青蛙跳台阶问题

链接:https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof

6.1 题目

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2
示例 2:

输入:n = 7
输出:21
示例 3:

输入:n = 0
输出:1
提示:

0 <= n <= 100

6.2 题解

class Solution {private int mod = 1000000007;private Map<Integer, Integer> memo = new HashMap<>();public int numWays(int n) {if (n == 0) return 1;if (n == 1) return 1;if (memo.containsKey(n)) {return memo.get(n);}int ret = (numWays(n-1)+numWays(n-2))%mod;memo.put(n, ret);return ret;}
}

7 三步问题

链接:https://leetcode.cn/problems/three-steps-problem-lcci

7.1 题目

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

输入:n = 3
输出:4
说明: 有四种走法
示例2:

输入:n = 5
输出:13

7.2 题解

7.2.1 递归(可能会超时)

class Solution {private int mod = 1000000007;private Map<Integer, Integer> m = new HashMap<>();public int waysToStep(int n) {if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 4;if (m.containsKey(n)) return m.get(n);int ret = ((waysToStep(n - 1) + waysToStep(n - 2)) % mod + waysToStep(n - 3)) % mod;m.put(n, ret);return ret; }
}

7.2.2 非递归

class Solution {public int  waysToStep(int n) {int mod = 1000000007;if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 4;int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 2;dp[3] = 4;for (int i = 4; i <= n; i++) {dp[i] = ((dp[i - 1] + dp[i - 2]) % mod + dp[i - 3]) % mod;}return dp[n];}
}

7.2.3 非递归+优化(内存优化)

class Solution {public int  waysToStep(int n) {int mod = 1000000007;if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 4;int a = 1;int b = 2;int c = 4;int d = 0;for (int i = 4; i <= n; i++) {d = ((c + b) % mod + a) % mod;a = b;b = c;c = d;}   return d;}
}

8 剑指 Offer 16. 数值的整数次方

链接:https://leetcode.cn/problems/shu-zhi-de-zheng-shu-ci-fang-lcof

8.1 题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100
示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

8.2 题解

class Solution {public double myPow(double x, int n) {if (n == 0) return 1;if (n == 1) return x;if (n == -1) return 1/x;double h = myPow(x, n / 2);double mod = myPow(x, n % 2);return h * h * mod;}
}

9 递归乘法

链接:https://leetcode.cn/problems/recursive-mulitply-lcci

9.1 题目

递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

示例1:

输入:A = 1, B = 10
输出:10
示例2:

输入:A = 3, B = 4
输出:12

9.2 题解

class Solution {public int multiply(int A, int B) {if (B == 0) return 0;return A + multiply(A, B - 1);}
}
class Solution {public int multiply(int A, int B) {int n = Math.min(A, B);int k = Math.max(A, B);if (n == 1) {return k;}int h = multiply(n / 2, k);if (n % 2 == 1) {return h + h + k;} else {return h + h;}}
}

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

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

相关文章

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…

scrapy下载图片

&#x1f431; 个人主页&#xff1a;莎萌玩家&#x1f64b;‍♂️ 作者简介&#xff1a;全栈领域新星创作者、专注于全栈各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01;&#x1f4ab;系列专栏&#xff1a;网络爬虫、WEB全栈开发&#x1f4e2; 资料…

你应该知道的ChatGPT提示语

ChatGPT 自上线以来&#xff0c;凭借其优异的自然语言理解和输出能力&#xff0c;仅花 5天就成为了活跃用户过百万的现象级产品。而上一个现象级产品 instagram 花了 2 个半月。到目前为止 ChatGPT 在全球累计用户数量已经过亿&#xff0c;相信现在也有很多人在跟 ChatGPT 聊过…

OKR 与 KPI有何异同?各部门OKR实例【小bu】

OKR 与 KPI&#xff0c;如何本土化是关键 近期公司计划对去年实施的绩效考核方案进行优化&#xff0c;公司以往采用 KPI 绩效考核方式&#xff0c;产生了一些争议。一方面&#xff0c;执行期间部分部门一度忽略指标设置的真实目的&#xff0c;导致出现短视思维和行为&#xff1…

TCP协议原理二

文章目录四、滑动窗口二、流量窗口三、拥塞控制四、滑动窗口 前面我们学习了 确认应答&#xff0c;超时重传&#xff0c;连接管理&#xff0c;这些机制都为我们TCP的可靠性提供了保证&#xff0c;当然在保证TCP的可靠性的同时&#xff0c;传输效率也受到了一定的影响&#xff…

05 DC-AC逆变器(DCAC Converter / Inverter)简介

文章目录0、概述逆变原理方波变换阶梯波变换斩控调制方式逆变器分类逆变器波形指标1、方波变换器A 单相单相全桥对称单脉冲调制移相单脉冲调制单相半桥2、方波变换器B 三相180度导通120度导通&#xff08;线、相的关系与180度相反&#xff09;3、阶梯波逆变器独立直流源二极管钳…

BLIP2-图像文本预训练

文章目录摘要解决问题算法模型结构通过frozen图像编码器学习视觉语言表征图像文本对比学习&#xff08;ITC&#xff09;基于图像文本生成&#xff08;ITG&#xff09;图文匹配&#xff08;ITM&#xff09;从大规模语言模型学习视觉到语言生成模型预训练预训练数据预训练图像编码…

Gehpi的网络布局

Gehpi的网络布局1. 力引导布局2. 辅助布局布局是网络可视化中的重要概念&#xff0c;指将点和边通过某种策略进行排布&#xff0c;应尽可能满足以下4个原则&#xff1a; 节点均匀分布在有限的区域内避免边的交叉和弯曲保持边的长度一致整体布局能反映图内在的特性 Gephi的布局…

Vision Transformer学习了什么-WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION

WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION 文章地址 代码地址 摘要 视觉转换器( Vision Transformers&#xff0c;ViTs )正在迅速成为计算机视觉的事实上的架构&#xff0c;但我们对它们为什么工作和学习什么知之甚少。虽然现有研究对卷积神经网络的机制进…

Bunifu.UI.WinForms 6.0.2 Crack

Bunifu.UI.WinForms为 WinForms创建令人惊叹的UI Bunifu.UI.WinForms我们为您提供了现代化的快速用户界面控件。用于 WinForms C# 和 VB.NET 应用程序开发的完美 UI 工具 简单 Bunifu.UI.WinForms没有臃肿的特征。正是您构建令人惊叹的 WinForms 应用程序所需要的。只需拖放然…

JavaSe第3次笔记

1.String str "hello";字符串类型。 2.两个字符串类型相加意思是拼接&#xff0c;类似于c语言里面的strcat函数。 3.整型变成字符串类型: int a 10; String str String. valueOf(a); 4.当字符串和其他类型进行相加的时候&#xff0c;结果就是字符串。(不完全…

MS9132是一款USB 3 0投屏芯片,内部集成USB 3 0 Device控制器、数据收发模块、音视频处理模块

MS9132是一款USB 3.0投屏芯片&#xff0c;内部集成USB 3.0 Device控制器、数据收发模块、音视频处理模块。MS9132可以通过USB 3.0接口将PC、智能手机、平板电脑上的信息显示或扩展到更大尺寸的显示设备&#xff0c;支持HDMI视频接口输出。 主要功能特征 HDMI 1.4b兼容 支持EDI…

RK3568编译Android11和目录讲解

文章目录 前言一、下载android11源码二、环境搭建1.增加交换内存三、编译瑞芯微原厂源码四、目录讲解总结前言 本文记录在Ubuntu18.04中编译Android11,只有编译了源码,后面才能进行驱动的开发,有兴趣的小伙伴可以和我一起学习吧! 提示:以下是本篇文章正文内容,下面案例可…

【华为OD机试模拟题】用 C++ 实现 - 剩余可用字符集 or @分割可用字符集(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明剩余可用字符集 or @分割可用字符集题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才…

烙铁使用方法

烙铁使用 烙铁是硬件工程师最经常使用的工具之一,一把性能保持良好的烙铁能帮助我们快速进行电路调试。烙铁第一次加热时采用焊锡均匀涂覆在烙铁头上,以便去除包在烙铁头上面的氧化物。在工作中我们需要根据情况选择合适的烙铁头类型,合适的温度进行操作。完成焊接后要在烙铁…

华为OD机试用Python实现 -【贪心的商人 or 最大利润】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲贪心的商人 or 最大利润题目描述输入描述输出描述说明示例一输入输出示例二输入输出Python 代码实现华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.c…

基于SpringCloud的可靠消息最终一致性01:定理、解决方案和框架

在互联网发展的早期,单体架构是主流的开发模式。因为访问的用户不多,所以整个系统的结构比较简单,就像一口竖井,从上到下,一通到底,如下图所示: 图一:单体应用 随着业务复杂度的不断提升,以及用户需求的不断增加,原来单个的业务系统已经不堪重负了。就好像一个窗口前…

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、

MS9123是一款单芯片USB投屏器&#xff0c;内部集成了USB2.0控制器和数据收发模块、视频DAC和音视频处理模块&#xff0c;MS9123可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上&#xff0c;支持CVBS、S-Video视频接口。 主要功能特征 C…

ChatGPT的互补工具Perplexity的详细使用方法(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…