Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剑指offer第7题:斐波拉契数列

剑指offer第7题:斐波拉契数列

作者头像
鹏-程-万-里
发布于 2020-07-20 08:01:04
发布于 2020-07-20 08:01:04
39100
代码可运行
举报
运行总次数:0
代码可运行

斐波拉契数列

剑指Offer 10- I :斐波那契数列【简单题】

题目描述

解决方法:

对于斐波拉契数列的使用,我们只需要知道通项公式,然后依次从第一项一直推导到第n项即可。根据题目中给出的通项公式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

在我们使用斐波拉契数列的时候,我们可以使用一个数组来存放每一项的值。在此题中,仅仅要求我们给出第n项的值,而且在斐波拉契数列中,计算第n项值的时候,仅仅需要前两项的值,所以我们可以仅仅使用两个值来代替f(n-1)f(n-2)即可,如下面的代码实现中那样。

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int fib(int n) {
        int pre = 0;
        if(n < 1) return pre;
        int cur = 1;
        if(n == 1 || n == 2) return cur;
        for(int i = 2 ; i <= n ;i++){
            int temp = pre + cur;
            pre = cur;
            cur = temp;
            cur = cur % 1000000007 ;
        }
        return cur;
    }
【思考】

《剑指offer》属于程序员必刷的数据结构书籍,所以剑指offer中的每一道题可谓是精华中的精华,为什么会从千万题海中选择一个简单的斐波拉契数列放在这本名书中呢?其中应该还是有很值得探索的地方。

如果我们仅仅从斐波拉契数列本身而看,这道题很显然是一道简单题。但是其背后的思路还是很值得我们研究的。

对比其他的题目:对一个数组或者容器进行遍历,然后求所需值。对于一些遍历容器数组中的题目而言,我们所遍历的容器其实是一个固定的内容。而斐波拉契数列有一个很重要的特点:数列中的每个元素都相互存在联系,每一个元素并非是简单的堆放在一起就完事儿了。

对于这些相互存在联系的元素而言,如果想要完整的描述整个序列。那么我们使用数学语言寻找到递推公式,类比到这里,递推公式就是F(N) = F(N - 1) + F(N - 2),然后依次考虑边界问题。而这个正是我们在使用动态规划时的解题思路

在我们使用动态规划的方法来解决类似问题时,我们的首要想法也依旧是从简单的两项或者三项互相推导开始,然后从边界条件与结束条件来考虑整道题的开始与结束。

所以作者把斐波拉契数列放在《剑指offer》中,更多的应该是为后续的动态规划做一个铺垫,让我们逐渐有这种推导元素间依赖关系的思维。小白认为,这可能才是一道简单题放在《剑指offer》中的意义所在吧!


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​LeetCode刷题实战509:斐波那契数
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2022/03/03
2000
DP入门之斐波那契数
力扣题目链接:https://leetcode-cn.com/problems/fibonacci-number
代码随想录
2021/12/29
5690
动态规划就这些招式!
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
代码随想录
2021/12/29
3960
动态规划就这些招式!
剑指offer | 面试题35:丑数
设已知长度为n的丑数序列 ,求第n+1个丑数 。根根据递推性质,丑数xn+1只可能 是以下三种情况其中之一 (索引a, b,c为未知数) :
千羽
2021/12/29
4340
剑指offer | 面试题35:丑数
剑指offer第8题:青蛙跳台阶
根据题意,我们可以看出整个题目的思路是十分清晰的。我们需要想办法将题目语言,先转化为数学符号,最后再转化为编程语言就十分方便了。下面我们来分析一些这道题目。
鹏-程-万-里
2020/07/20
5590
《剑指offer》专题—算法训练 day02
文章目录 《剑指offer》专题—算法训练 day02 一、替换空格 思路 二、从尾到头打印链表 思路一 思路二 思路三 三、重建二叉树 思路 四、斐波那契数列 思路一 思路二 未完待续...
RAIN7
2021/09/30
2220
《剑指offer》专题—算法训练 day02
算法之动态规划
动态规划(Dynamic Programming,简称DP)算法是一种通过将问题(比较复杂)划分为相互重叠的子问题(简单易于求解),并解决子问题来解决原问题的方法。它通常用于优化问题,其中需要找到最优解或最大/最小值。
九转成圣
2024/04/10
2120
算法之动态规划
动态规划:斐波那契数
题目地址:https://leetcode-cn.com/problems/fibonacci-number/
代码随想录
2021/01/12
4640
剑指offer | 面试题34:1~n 整数中 1 出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
千羽
2021/12/29
2990
剑指offer | 面试题34:1~n 整数中 1 出现的次数
动态规划之背包问题——01背包
背包问题中我们常见的就是 01背包和 完全背包。在leetcode的题库中主要就是这两种类型的题目。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。所以背包问题的基础就是01背包问题。完全背包问题请参考 动态规划之背包问题——完全背包。
全栈程序员站长
2022/09/17
8360
动态规划之背包问题——01背包
DP:斐波那契数列模型
动态规划(Dynamic Programming,简称DP)是一种通过将复杂问题分解为更小的子问题来求解的算法设计技术。动态规划通常应用于有重叠子问题和最优子结构性质的问题。其基本思想是将问题分解成子问题,分别求解这些子问题,并将其结果保存起来以供后续使用,从而避免重复计算。
用户11305458
2024/10/09
1290
DP:斐波那契数列模型
【算法日记】从零开始认识动态规划(一)
动态规划(Dynamic Programming),简称DP。动态规划的核心是依次解决子问题,通过状态转化得到最终的结果。也就是说,针对可以划分成若干子问题的问题,我们可以使用动态规划来进行解决。
叫我龙翔
2025/01/10
1841
【算法日记】从零开始认识动态规划(一)
剑指offer | 面试题47:n个骰子的点数
暴力法需要遍历所有点数组合,因此时间复杂度为 ,观察本题输入取值范围 1≤n≤11
千羽
2022/02/25
1.2K0
剑指offer | 面试题47:n个骰子的点数
本周小结!(动态规划系列四)
所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。
代码随想录
2021/02/26
3170
本周小结!(动态规划系列四)
Leetcode 题目解析:70. 爬楼梯
在前面算法题目解析:从一道题目看动态规划这篇文章中,描述了动态规划的概念、原理和典型示例,今天用几道典型的动态规划题目来做为练手,达到掌握的目的。70. 爬楼梯是一道简单题,但比较典型,先从它开始。
程序员架构进阶
2021/11/04
3850
算法一看就懂之「 递归 」
之前的文章咱们已经聊过了「 数组和链表 」、「 堆栈 」和「 队列 」,今天咱们来看看「 递归 」,当然「 递归 」并不是一种数据结构,它是很多算法都使用的一种编程方法。它太普遍了,并且用它来解决问题非常的优雅,但它又不是那么容易弄懂,所以我特意用一篇文章来介绍它。
奎哥
2019/09/11
5880
算法一看就懂之「 递归 」
动态规划:Carl称它为排列总和!
题目链接:https://leetcode-cn.com/problems/combination-sum-iv/
代码随想录
2021/02/26
5440
动态规划:Carl称它为排列总和!
动态规划:本周我们都讲了这些(系列六)
本周我们主要讲解了打家劫舍系列,这个系列也是dp解决的经典问题,那么来看看我们收获了哪些呢,一起来回顾一下吧。
代码随想录
2021/03/16
3550
动态规划:本周我们都讲了这些(系列六)
一文说清动态规划
动态规划(dynamic programming,简称 dp)是工程中非常重要的解决问题的思想,从我们在工程中地图软件上应用的最短路径问题,再在生活中的在淘宝上如何凑单以便利用满减券来最大程度地达到我们合理薅羊毛的目的 ,很多时候都能看到它的身影。不过动态规划对初学者来说确实比较难,dp状态,状态转移方程让人摸不着头脑,网上很多人也反馈不太好学。其实任何算法的学习都是有它的规律和套路的,只要掌握好它的规律及解题的套路,再加上大量的习题练习,相信掌握它不是什么难事。本文将会用比较浅显易懂地讲解来帮助大家掌握动态规划这一在工程中非常重要的思想,相信看完后,动态规划的解题套路一定能手到擒来(文章有点长,建议先收藏再看,看完后一定会对动态规划的认知上升到一个台阶!)
Crossin先生
2020/02/25
8240
动态规划:判断子序列
题目链接:https://leetcode-cn.com/problems/is-subsequence/
代码随想录
2021/04/07
6880
动态规划:判断子序列
相关推荐
​LeetCode刷题实战509:斐波那契数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验