leetcode 面試題 08.01. 三步問題(同上樓梯問題,待深究)

【題目】面試題 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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章