牛客刷题:斐波那契数列(跳台阶)

描述(注:斐波那契数列_牛客题霸_牛客网

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

斐波那契数列是一个满足

fib(x)=1    当x=1,2 

fib(x)=fib(x−1)+fib(x−2)​  当x>2​ 的数列

数据范围:1≤n≤40

要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn)的解法。

######################################

该题是一个动态规划的题目,因为函数的取值函数之前的值fib(x−1)+fib(x−2)有关。

所以利用递归的方法可以很好的解决这个问题。

递归是一种强大的编程和算法设计范式,其核心思想在于:一个函数或过程通过直接或间接地调用自身,将复杂的大规模问题分解为结构相同但规模更小的子问题,直至分解到可直接求解的基础情形(Base Case),从而最终解决原问题。

递归过程
    public int Fibonacci (int n) {
        // write code here
        if(n==1 || n==2){
            return 1;
        }
        return Fibonacci(n-1)+Fibonacci(n-2);
    }

在python这里这么往往报错:超时。但我们可以加入    @lru_cache来解决。

from functools import lru_cache
class Solution:
    @lru_cache
    def Fibonacci(self , n: int) -> int:
        #数组长度都为n,元素为1.
        if(n==1 or n==2):
            return 1
        return self.Fibonacci(n-1)+self.Fibonacci(n-2)

pyhton方法二:

这里利用了数组来解决。result=[1]*n,表示长度为n的元素为1的数组。

class Solution:
    def Fibonacci(self , n: int) -> int:
        result=[1]*n
        #print(result[0])
        if n>2:
            for i in range(2,n):
                result[i]=result[i-1]+result[i-2]
        return result[n-1]

总结:该题很简单的,唯一的难点是在理解递归的思想。当然我们可以把递归理解为照镜子,这时候看向镜子中的自己的眼睛,一层层的深入。递归上面的那个图希望给大家启发。

这个题目给出了答案,那么下面这个题目,就是个隐藏的动态规划。

##################################################################

描述(注:跳台阶_牛客题霸_牛客网

描述

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

数据范围:1≤n≤40

要求:时间复杂度:O(n) ,空间复杂度:O(1)

————————————————————————————————

改题目可以举例分析一下,从开始到1号台阶,只能1种方法;到2号台阶,有两种方法(从开始和从1号台阶上去);这是不是说明当x=1时,f(x)=1;当x=2时,f(x)=2;

现在我们逆向想一想,如果到f(x)有多少种方法

我们知道f(x)有两种方法跳上来即从f(x-1)和f(x-2),f(x)=f(x-1)+f(x-2)

那么这个题目是不是转化为和上面那个斐波那契数列相似了呢。

于是代码有

    public int jumpFloor (int number) {
        // write code here
        if(number==1){
            return 1;
        }
        if(number==2){
            return 2;
        }
        return jumpFloor(number-1)+jumpFloor(number-2);
    }
from functools import lru_cache
class Solution:
    @lru_cache
    def jumpFloor(self , number: int) -> int:
        # write code here
        if number==1:
            return 1
        if number==2:
            return 2
        return self.jumpFloor(number-1)+self.jumpFloor(number-2)

总结:

这里是动态规划问题,一个是给出了函数,总结了规律。另一个是隐藏了,需要我们思考如何去解决,这里可以从开始探索,再从结果逆向推导,往往能找到问题的解决方式。

希望对大家有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值