力扣刷题刷到两道斐波那契数列相关的题
总体思路是:用 f(x) 表示爬到第 x 级台阶的方案数,考虑第一步可能跨了一级台阶,也可能跨了两级台阶,所以在跨出第一步后有如下式子:(图左为斐波那契数列,图右为爬梯子公式)
也就是说爬到第 x级台阶的方案数是爬到第 x - 1级台阶的方案数和爬到第 x - 2级台阶的方案数的和。
以下两题都是用动态规划的思路解题的,因为动态规划的时间复杂度为 O(n),空间复杂度为O(1)
力扣70题:爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
int climbStairs(int n){
if(n==1) return 1;
if(n==2) return 2;
int result = 0;
int pre = 2;
int prePre = 1;
int i;
for(i = 3;i<=n; i++){
result = pre + prePre;
prePre = pre ;
pre = result ;
}
return result;
}
剑指Offer-10:斐波那契数列
int fib(int n){
if(n==0) return 0;
if(n==1) return 1;
int result = 0;
int pre= 1;
int prePre = 0;
for(int i = 2;i <= n; ++i){
result = (pre + prePre)%1000000007;
#这个为什么要取余啊!百度出来都是一模一样的话,听君一席话,胜似一席话
prePre = pre;
pre = result;
}
return result;
}