题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路
《剑指offer》P73
书中指出,很容易想到的递归解法,也存在很明显的效率问题,如下图:
可以看出该树中很多节点是重复的,算法的时间复杂度是以n的指数形式递增的,因此本题如果用递归做则会超时。
code
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n == 0 or n == 1:
return n
smallNumber = 0
bigNumber = 1
res = 0
for i in range(2, n + 1):
res = smallNumber + bigNumber
smallNumber = bigNumber
bigNumber = res
return res
拓展
1. 青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if number == 0 or number == 1:
return 1
smallNumber = 1
bigNumber = 1
res = 0
for i in range(2, number + 1):
res = smallNumber + bigNumber
smallNumber = bigNumber
bigNumber = res
return res
2. 变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
f
(
0
)
=
1
f(0)=1
f(0)=1
f
(
1
)
=
1
f(1)=1
f(1)=1
······
f
(
n
)
=
f
(
0
)
+
f
(
1
)
+
⋅
⋅
⋅
+
f
(
n
−
1
)
f(n)=f(0)+f(1)+···+f(n-1)
f(n)=f(0)+f(1)+⋅⋅⋅+f(n−1)
f
(
n
+
1
)
=
f
(
0
)
+
f
(
1
)
+
⋅
⋅
⋅
+
f
(
n
−
1
)
+
f
(
n
)
f(n+1)=f(0)+f(1)+···+f(n-1)+f(n)
f(n+1)=f(0)+f(1)+⋅⋅⋅+f(n−1)+f(n)
由数学归纳法可得:
f
(
n
+
1
)
−
f
(
n
)
=
f
(
n
)
f(n+1)-f(n)=f(n)
f(n+1)−f(n)=f(n)
f
(
n
+
1
)
=
2
∗
f
(
n
)
f(n+1)=2*f(n)
f(n+1)=2∗f(n)
因此,可以得到公式:
f
(
n
)
=
f(n)=
f(n)=
f
(
n
)
=
{
1
,
n
=
0
1
,
n
=
1
2
∗
f
(
n
−
1
)
,
n
>
1
f(n)= \begin{cases} 1, & \text {$n=0$} \\ 1, & \text {$n=1$} \\ 2*f(n-1), & \text{$n>1$} \end{cases}
f(n)=⎩⎪⎨⎪⎧1,1,2∗f(n−1),n=0n=1n>1
可见该问题与斐波那契数列为同类问题。
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 0 or number == 1:
return 1
preNumber = 1
res = 0
for i in range(2, number + 1):
res = preNumber * 2
preNumber = res
return res
3. 矩阵覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路
推理过程同斐波那契数列。