【題目】面試題 08.01. 三步問題
三步問題。有個小孩正在上樓梯,樓梯有n階臺階,小孩一次可以上1階、2階或3階。實現一種方法,計算小孩有多少種上樓梯的方式。結果可能很大,你需要對結果模1000000007。
示例1:
輸入:n = 3
輸出:4
說明: 有四種走法
示例2:
輸入:n = 5
輸出:13
提示:
n範圍在[1, 1000000]之間
【解題思路1】動態規劃
思路和上樓梯問題一致,n層樓梯的走法可以分爲三種情況(1:剩餘一層樓梯要走然後一步走一層,2:剩餘兩層樓梯要走,然後一步走兩層,3:剩餘三層樓梯要走,然後一步走三層)dp[n] = dp[n-1] + dp[n-2] + dp[n-3]
取模tips:
取模,對兩個較大的數之和取模再對整體取模,防止越界(這裏也是有講究的)
假如對三個dp[i-n]都 % 1000000007,那麼也是會出現越界情況(導致溢出變爲負數的問題)
因爲如果本來三個dp[i-n]都接近 1000000007 那麼取模後仍然不變,但三個相加則溢出
但對兩個較大的dp[i-n]:dp[i-2],dp[i-3]之和mod 1000000007,那麼這兩個較大的數相加大於 1000000007但又不溢出
取模後變成一個很小的數,與dp[i-1]相加也不溢出
class Solution {
public int waysToStep(int n) {
if (n <= 2) {
return n;
}
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i < n+1; i++) {
dp[i] = (dp[i-1] + (dp[i-2] + dp[i-3]) % 1000000007) % 1000000007;
}
return dp[n];
}
}