[剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]

【问题描述】[中等]

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 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. 动态规划

在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int fib(int n) {if(n == 0) return 0;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for(int i = 2; i <= n; i++){dp[i] = dp[i-1] + dp[i-2];dp[i] %= 1000000007;}return dp[n];}
}
2. 动态规划空间复杂度优化

dp[n + 1] -> abc
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

public int fib(int n) {if(n==0 ){return 0;}if(n==1 ){return 1;}int a = 0;int b = 1;int c = 0;for(int i =2; i<=n;i++){c =(a +b)%1000000007;a = b ;b = c ;}return  c;}
3. 递归(超时)

在这里插入图片描述
时间复杂度:O(2^N) 空间复杂度:O(1)

  public int fib(int n) {if(n==0) return 0;if(n==1) return 1;return (fib(n-1)+fib(n-2))%1000000007;}
4. 记忆化递归在这里插入图片描述

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public int fib(int n) {if(n == 0) return 0;int[] memorization = new int[n+1]; //用于存储第0~n个数对应的值memorization[1] = 1; //第一二个数先定义好,由于第一个数是0,默认即可不用写出return Fibonacci(n,memorization);}public int Fibonacci(int n,int[] memo) {if(n < 2 ) //当n等于0或1时,将不再往下递归,直接返回记忆化结果对应的值return memo[n];if(memo[n] > 0) //当遇到之前计算过的数时,将不再递归往下找,直接用记忆化结果return memo[n];memo[n] = (Fibonacci(n - 2, memo) + Fibonacci(n - 1, memo)) % 1000000007;return memo[n];}
}

【总结】

1.取余原因

“int32类型是十位数,对1e9取模可防止int32溢出”、“1e9+7是质数,对质数取模可以尽可能地让模数避免相等”以及“1e9+7是离1e9最近的质数,比较好记”

2.动态规划和记忆化递归区别

原理类似,动态规划有可能把空间复杂度降至 O(1)

3. 一开始就想到了方法二,其实方法二来源于动态规划的优化

转载链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/solution/mian-shi-ti-10-i-fei-bo-na-qi-shu-lie-dong-tai-gui/

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

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

相关文章

js生成的cookie在yii2中获取不到的解决办法

在js中创建的cookie&#xff0c;默认用yii2中自带的方法Yii::$app->request->cookies->get(abc)获取不到&#xff0c;而用$_COOKIE[abc]又是能获取到&#xff0c;则是以下原因照成的。 查看E:\myYiiDemo\vendor\yiisoft\yii2\web\Request.php中的1218行不难看出&#…

html:(25):选择器定义和标签选择器

什么是选择器&#xff1f; 每一条css样式声明&#xff08;定义&#xff09;由两部分组成&#xff0c;形式如下&#xff1a; 选择器{样式; } 在{}之前的部分就是“选择器”&#xff0c;“选择器”指明了{}中的“样式”的作用对象&#xff0c;也就是“样式”作用于网页中的哪些…

[剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]

【问题描述】[中等] 求 12...n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。输入: n 3 输出: 6【解答思路】 1. 递归&#xff08;不合符题意&#xff09; 时间复杂度&#xff1a;O(N^2) 空间…

Celery工具

什么是Celery Celery的功能 Celery是基于python实现的第三方组件&#xff0c;可以实现定时任务、周期任务等。 Celery的组成 Celery的角色 - 任务,创建或发布任务。 - 使用redis/rabbitMQ进行任务记录(broker)和任务返回结果&#xff08;backend)的缓存。 - worker&#xff0c;…

POJ-3061 尺取

题意就是 在P张书页中 其中有重复元素 选取最小连续区间内包括了这期间的所有不同的数 求符合条件的最小区间长度 本题可以用尺取法所谓尺取 就是选取两个下标 s e 分别指向当前扫面区间的首尾开始赋值都是1 然后分析数串 把e向后移 找到一种符合条件的区间后再把s向后移不断判…

html:(26):类选择器和id选择器

类选择器 类选择器在css样式编码中是最常用到的&#xff0c;如右侧代码编辑器中的代码:可以实现为“胆小如鼠”、“勇气”字体设置为红色。 语法&#xff1a; .类选器名称{css样式代码;} 注意&#xff1a; 1、英文圆点开头 2、其中类选器名称可以任意起名&#xff08;但不…

[剑指offer][JAVA]面试题第[10-2]题[青蛙跳台阶问题][动态规划][递归]

【问题描述】[中等] 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。【解答思路…

SpringCloud(三)之Feign实现负载均衡的使用

一 点睛 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c; Feign可以帮助我们更快捷、优雅地调用HTTP API。 在Spring Cloud中&#xff0c;使用Feign非常简单——创建一个接口&#xff0c;并在接口上添加一些注解&#xff0c;代码就完成了。Feign支持多种注解&…

Bound Found POJ - 2566 (尺取+前缀和)

题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性 没有特殊的特征 若对区间求一下前缀和 就使整个区间有了单调性 由于绝对值情况下 没有前后 所以…

[剑指offer][JAVA]面试题第[11]题[旋转数组的最小数字][二分法][分治]

【问题描述】[简单] 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如&#xff0c;数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转&#xff0c;该数组的最小值为1。 示…

html:(27):类和ID选择器的区别和子选择器

类和ID选择器的区别 学习了类选择器和ID选择器&#xff0c;我们会发现他们之间有很多的相似处&#xff0c;是不是两者可以通用呢&#xff1f;我们不要着急先来总结一下他们的相同点和不同点&#xff1a; 相同点&#xff1a;可以应用于任何元素不同点&#xff1a; 1、ID选择器…

对象的释放Dispose和Close对比

C#内存释放的几个方法对比&#xff1a; 而Close与Dispose这两种方法的区别在于&#xff0c;调用完了对象的Close方法后&#xff0c;此对象有可能被重新进行使用&#xff1b;而Dispose方法来说&#xff0c;此对象所占有的资源需要被标记为无用了&#xff0c;也就是此对象被销毁了…

html:(28):后代选择器和通用选择器

包含(后代)选择器 包含选择器&#xff0c;即加入空格,用于选择指定标签元素下的后辈元素。如右侧代码编辑器中的代码&#xff1a; .first span{color:red;} 这行代码会使第一段文字内容中的“胆小如鼠”字体颜色变为红色。 请注意这个选择器与子选择器的区别&#xff0c;子…

ZOJ -3203 三分+数学

题意&#xff1a;给出光的高度&#xff0c;人的高度&#xff0c;还有屋子的宽度本题就是要求人站在什么地方影长最长 输出最长的影长数学题可以把这道题的分段公式推出来然后分类讨论x在不同的范围获得不同的大小或者把影长公式推出来发现是凸函数 可以求极值点 然后三分求 三…

Java异常面试题

Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error&#xff08;错误&#xff09;3. Exception&#xff08;异常&#xff09;运行时异常编译时异常4. 受检异常与非受检异常受检异常非受检异常Java异常关键字Java异常处理声明异常抛出异常捕获异常如何选择异…

html:(29):伪选择符和分组选择符

伪类选择符 更有趣的是伪类选择符&#xff0c;为什么叫做伪类选择符&#xff0c;它允许给html不存在的标签&#xff08;标签的某种状态&#xff09;设置样式&#xff0c;比如说我们给html中一个标签元素的鼠标滑过的状态来设置字体颜色&#xff1a; a:hover{color:red;} 上面…

[Leedcode][JAVA][第837题][新21点][动态规划][数学]

【问题描述】[中等] 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏&#xff0c;描述如下&#xff1a;爱丽丝以 0 分开始&#xff0c;并在她的得分少于 K 分时抽取数字。 抽取时&#xff0c;她从 [1, W] 的范围中随机获得一个整数作为分数进行累计&#xff0c;其中 W 是…

Java学习笔记1(零碎笔记)——基础

目录命名流程控制方法OOP异常其它命名 变量、方法&#xff1a;驼峰命名 类&#xff1a;首字母大写&#xff0b;驼峰命名 流程控制 增强型for循环&#xff1a; for(数据类型 名称 : 数组){&#xff08;操作&#xff09; }&#xff08;意思是遍历数组&#xff0c;从数组的0号…

扩展欧几里得算法 POJ 1061

根据此题 整理下 扩展欧几里得 扩展欧几里得是用来判断并求 ax by c 是否有解及其解的数学算法 首先列出定理 1、ax by gcd(a,b) 2、gcd(a,b) gcd(b, a%b); 本题 题意是 判断两个同向的青蛙 在初始位置(x,y)&#xff0c;速度不同(m,n)的情况下能否在一个球形路线(周长为…

html:(30):继承和特殊性

继承 CSS的某些样式是具有继承性的&#xff0c;那么什么是继承呢&#xff1f;继承是一种规则&#xff0c;它允许样式不仅应用于某个特定html标签元素&#xff0c;而且应用于其后代。比如下面代码&#xff1a;如某种颜色应用于p标签&#xff0c;这个颜色设置不仅应用p标签&…