描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:
要求:时间复杂度O(n): ,空间复杂度O(1):
class Solution:
def jumpFloor(self, number):
# write code here
if number <= 0:
return 0
if number == 1 or number == 2:
return number
dp = [None for i in range(number+1)]
dp[0] = 0
dp[1] = 1
dp[2] = 2
for i in range(3, number+1):
if i < 3:
dp[i] = i
else:
dp[i] = dp[i - 1] + dp[i - 2]
return dp[number]
if __name__ == "__main__":
sol = Solution()
print(sol.jumpFloor(7))
动态规划的典型题目
-
先处理边界值,在第0个台阶,跳法为无,在第1个台阶,跳法就是
1
,在第2个台阶,跳法就是2
-
在每一个台阶,其有可能是上一级台阶跳上来的,也可以是上上一节台阶跳上来的。
设 f ( i ) f(i) f(i)为在第i级台阶所具有的所有跳法 ,则 f ( i ) = f ( i − 1 ) + f ( i − 2 ) f(i) = f(i-1) + f(i-2) f(i)=f(i−1)+f(i−2)。
其理解为: 如果固定这个节点是在第i-1个节点,跳一级台阶上来的,这次跳跃不会增加方法量, 那么其方法总量就是 f ( i − 1 ) f(i-1) f(i−1);如果固定是从i-2个节点,跳两级上来的,这次跳跃不会增加方法量,那么总方法量就是 f ( i − 2 ) f(i-2) f(i−2)。但是,我们并不知道具体怎么上来的,两种都有可能,所以总方法量就是 f ( i − 1 ) + f ( i − 2 ) f(i-1)+f(i-2) f(i−1)+f(i−2)。
上面形成了状态转移方程。之后就好办了,处理完边界值,循环转移就可以了。
不过,要求空间复杂度为 O ( 1 ) O(1) O(1),
那么,就要有另一个版本了。
class Solutionv2(object):
def jumpFloor_infer(self, number):
# write code here
if number <= 0:
return 0
if number == 1 or number == 2:
return number
dp = [None for i in range(3)]
dp[0] = 0
dp[1] = 1
dp[2] = 2
for i in range(3, number+1):
if i < 3:
dp[i] = i
else:
dp[i%3] = dp[(i - 1)%3] + dp[(i - 2)%3]
return dp[number%3]