要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:267410
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:通项公式
对于一个 n n n阶的台阶,可以分为以下几种情况来得到:
- 直接跳 n n n个台阶,一共有一种方法;
- 先跳 n − 1 n-1 n−1阶台阶,然后最后一步跳 1 1 1个台阶,一共有 f ( n − 1 ) f(n-1) f(n−1)中方法;
- 先跳
n
−
2
n-2
n−2阶台阶,然后最后一步跳
2
2
2个台阶,一共有
f
(
n
−
2
)
f(n-2)
f(n−2)中方法;
. . . ... ... - 先跳
1
1
1个台阶,然后最后一步跳
n
−
1
n-1
n−1个台阶,一共有
f
(
1
)
f(1)
f(1)中方法。
不难得到 f ( n ) f(n) f(n)的通项公式:
f ( n ) = f ( 1 ) + f ( 2 ) + . . . + f ( n − 1 ) + 1 f(n)=f(1)+f(2)+...+f(n-1)+1 f(n)=f(1)+f(2)+...+f(n−1)+1
下面求解通项公式:
f
(
1
)
=
1
f(1)=1
f(1)=1
f
(
2
)
=
2
f(2)=2
f(2)=2
f
(
3
)
=
f
(
1
)
+
f
(
2
)
+
1
f(3)=f(1)+f(2)+1
f(3)=f(1)+f(2)+1
f
(
4
)
=
f
(
3
)
+
f
(
2
)
+
f
(
1
)
+
1
=
2
(
f
(
2
)
+
f
(
1
)
+
1
)
f(4)=f(3)+f(2)+f(1)+1=2(f(2)+f(1)+1)
f(4)=f(3)+f(2)+f(1)+1=2(f(2)+f(1)+1)
.
.
.
...
...
f
(
n
)
=
2
n
−
3
(
f
(
2
)
+
f
(
1
)
+
1
)
=
2
n
−
3
⋅
4
=
2
n
−
1
f(n)=2^{n-3}(f(2)+f(1)+1)=2^{n-3}\cdot 4=2^{n-1}
f(n)=2n−3(f(2)+f(1)+1)=2n−3⋅4=2n−1
该方法的时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)。
更为简单的思路:
每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用
2
n
−
1
2^{n-1}
2n−1中情况
python实现
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
return 2**(number-1)
- 运行时间:25ms
- 占用内存:5860k
C++实现
class Solution {
public:
int jumpFloorII(int number) {
if (number == 1 || number == 2)
return number;
int res = 1;
for (int i=1; i<number; i++)
res *= 2;
return res;
}
};
- 运行时间:4ms
- 占用内存:476k
C++实现:移位操作
这种方法当测试用例特别大的时候可能会得到错误的结果。
class Solution {
public:
int jumpFloorII(int number) {
return 1<<(number-1);
}
};
- 运行时间:4ms
- 占用内存:476k