要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:335829
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路
思路一:排列组合法
假设一共有xxx次是跳一级台阶,yyy次是跳二级台阶。那么有x+2y=nx+2y=nx+2y=n,我们遍历所有满足条件的xxx和yyy,并且对每种xxx,yyy计算Cx+yxC^x_{x+y}Cx+yx,最后将所有可能相加得到最终结果。该方法时间复杂度为O(n2)O(n^2)O(n2),空间复杂度为O(1)O(1)O(1)。由于在求解排列组合时浮点数溢出所以未能通过,此步需要经过特殊处理,下面仅给出C++实现的版本。
C++实现
class Solution {
public:
int jumpFloor(int number) {
int x; int y; int count = 0;
for (x=0; x<=number; x++){
if ((number-x)>0 && (number-x)%2==0)
y = (number - x) / 2;
else
y = 0;
if (x + 2*y == number){
int temp = 1; int temp2 = 1;
for (int i=0; i<x; i++){
temp *= (x+y-i);
temp2 *= (x-i);
}
count += temp / temp2;
}
}
return count;
}
};
思路二:斐波那契数列
对于n阶台阶,既可以由n-1阶走一步得到,也可以由n-2阶走两步得到。因此f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2),并且f(1)=1,f(2)=2f(1)=1, f(2)=2f(1)=1,f(2)=2.
python实现
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
s = [1, 1]
while len(s) <= number:
s.append(s[-1] + s[-2])
return s[number]
- 运行时间:22ms
- 占用内存:5724k
C++实现
class Solution {
public:
int jumpFloor(int number) {
if (number == 1 || number == 2)
return number;
int prePreNum = 1; int preNum = 2;
// 往前推进n-1步,prePreNum对应的位置就为n-1+1=n
while(number>1){
preNum = prePreNum + preNum;
prePreNum = preNum - prePreNum;
number--;
}
return prePreNum;
}
};
- 运行时间:3ms
- 占用内存:472k