idea:显然可以推出
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
…
+
f
(
1
)
+
1
(
1
)
f(n) = f(n-1)+f(n-2)+\ldots+f(1)+1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)
f(n)=f(n−1)+f(n−2)+…+f(1)+1(1) 即最后一步是1步或2步或…或n步时的情况相加,又因
f
(
n
−
1
)
=
f
(
n
−
2
)
+
f
(
n
−
3
)
+
…
+
f
(
1
)
+
1
(
2
)
f(n-1) = f(n-2)+f(n-3)+\ldots+f(1)+1 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2)
f(n−1)=f(n−2)+f(n−3)+…+f(1)+1(2) 因此
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
1
)
=
2
×
f
(
n
−
1
)
(
3
)
f(n) = f(n-1)+f(n-1)=2 \times f(n-1) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (3)
f(n)=f(n−1)+f(n−1)=2×f(n−1)(3) 即公式(1)中的后面n-1项刚好与第一项相等。
code
class Solution {
public:
int jumpFloorII(int number) {
if (number == NULL) return NULL;
if (number == 1) return 1;
if (number == 2) return 2;
int res = 2;
for (int i = 2;i<number;i++)
res = res*2;
return res;
}
};
或者直接用位运算一步到位
class Solution {
public:
int jumpFloorII(int number) {
if (number == 0 || number == NULL) return NULL;
return 1 << (--number);
}
};