👉 题目来源:
牛客网 —— 斐波那契数列
牛客网 —— 跳台阶
牛客网 —— 变态跳台阶
题目描述
- 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题解
F(n) = F(n-1) + F(n-2)
递归的时间复杂度太高, 用两个变量存储F(n-2)和F(n-1)
class Solution {
public:
int Fibonacci(int n) {
if(n<=1)
return n;
else{
int sum = 0;
int one = 0;
int two = 1;
for(int i = 2;i<=n;i++){
sum = one + two;
one = two;
two = sum;
}
return sum;
}
}
};
- 思路:跳n级台阶相当于n-1和n-2级台阶的和
原因:n级台阶就相当于n-1级再跳一次一阶的和n-2级再跳一次2阶的
class Solution {
public:
int jumpFloor(int number) {
if(number == 1)
return 1;
else if(number == 2)
return 2;
else
return jumpFloor(number-1) + jumpFloor(number-2);
}
};
- 思路:
设 n 级台阶有 F(n) 种跳法,F(1) = 1;
最后一次跳台阶的数目可以分解为
最后一次一次性跳一级台阶,则前面需要跳 n-1 级台阶,有 F(n−1) 种跳法;
最后一次一次性跳两级台阶 ,则前面需要跳 n- 2 级台阶,有 F(n-2) 种跳法。以此类推 易知,
F(n) = F(n−1) + F(n−2) + …… F(1)
F(n−1) = F(n−2) + F(n-3) + …… F(1)
两式相减:
F(n) = 2F(n-1)
class Solution {
public:
int jumpFloorII(int number) {
if(number == 1)
return 1;
else
return 2*jumpFloorII(number-1);
}
};