跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
本题就是一个简单的斐波那契数列问题。
代码
class Solution {
public:
int jumpFloor(int n) {
/* //方法一
int prev = 0;
int cur = 1;
for(int i = 1; i <= n ; ++i){
int tmp = cur;
cur = prev + cur;
prev = tmp;
}
return cur;
*/
//方法二:斐波那契数列通项公式
double s = sqrt(5);
return floor((pow((1+s)/2, n+1) + pow((1-s)/2, n+1))/s + 0.5);
}
};
变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
方法一分析
当台阶数为n时,可以分为以下步骤来完成:
设第一次跳的台阶数为s,跳台阶方式数为T,则:
(1)s=1时,
T(n)=T(n−1)
(2)s=2时,
T(n)=T(n−2)
.
.
.
(n)s=n时,
T(n)=T(0)=1
所以总的跳台阶方式数T可以表示为:
由于 T(0)=T(1)=1 ,所以 T(n)=2(n−1)
代码
class Solution {
public:
int jumpFloorII(int number) {
long long result=(long long)pow(2,number-1);
return result;
}
};
方法二分析
1、 当
n=1
时, 只有一种跳法,即1阶跳:
Fib(1)=1
;
2、当
n=2
时, 有两种跳的方式,一阶跳和二阶跳:
3、当 n=3 时,有三种跳的方式,第一次跳出一阶后,后面还有 Fib(3−1) 中跳法; 第一次跳出二阶后,后面还有 Fib(3−2) 中跳法;第一次跳出三阶后,后面还有 Fib(3−3) 中跳法
n、当 n=n 时,共有n种跳的方式,第一次跳出一阶后,后面还有 Fib(n−1) 中跳法; 第一次跳出二阶后,后面还有 Fib(n−2) 中跳法………第一次跳出n阶后,后面还有 Fib(n−n) 中跳法.
两式相减得:
代码
class Solution {
public:
int jumpFloorII(int number) {
if(number<= 0)
return 0;
if(number==1)
return 1;
long long FibN = 1;
for(int i=2;i<=number;i++)
{
FibN *= 2;
}
return FibN;
}
};
注:代码在牛客网平台调试通过。调试平台:链接
参考资料:
1、http://www.acmerblog.com/offer16-jiudu-1389-4082.html
2、https://leetcode.com/discuss/16866/basically-its-a-fibonacci