描述(注:斐波那契数列_牛客题霸_牛客网)
大家都知道斐波那契数列,现在要求输入一个正整数 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)
总结:
这里是动态规划问题,一个是给出了函数,总结了规律。另一个是隐藏了,需要我们思考如何去解决,这里可以从开始探索,再从结果逆向推导,往往能找到问题的解决方式。
希望对大家有帮助。