LeetCode 面試題10- II. 青蛙跳臺階問題【劍指Offer】【Easy】【Python】【動態(tài)規(guī)劃】
問題
一只青蛙一次可以跳上1級臺階违孝,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法局嘁。
答案需要取模 1e9+7(1000000007)裳仆,如計算初始結(jié)果為:1000000008腕让,請返回 1。
示例 1:
輸入:n = 2
輸出:2
示例 2:
輸入:n = 7
輸出:21
提示:
0 <= n <= 100
注意:本題與主站 70 題 相同歧斟。
思路
動態(tài)規(guī)劃
初始條件和斐波那契數(shù)列有點區(qū)別:dp_0 = 1纯丸,dp_1 = 1。
fib(n) = fib(n - 1) + fib(n - 2)
注意静袖,fib(n)會越界觉鼻,所以最好是:
fib(n) % 1000000007 = (fib(n - 1) % 1000000007 + fib(n - 2) % 1000000007) % 1000000007
但是因為 Python 中整形數(shù)字的大小限制取決計算機的內(nèi)存(可理解為無限大),因此可不考慮大數(shù)越界問題勾徽。
時間復(fù)雜度: O(n)
空間復(fù)雜度: O(1)
Python3代碼
class Solution:
def numWays(self, n: int) -> int:
# 初始條件和斐波那契數(shù)列有區(qū)別
dp_0, dp_1 = 1, 1
for _ in range(n):
dp_0, dp_1 = dp_1, dp_0 + dp_1
return dp_0 % 1000000007