天天看点

Leetcode:面试题 08.01. 三步问题(动态规划,取模方法)

面试题 08.01. 三步问题

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

输入:n = 3

输出:4

说明: 有四种走法

示例2:

输入:n = 5

输出:13

提示:

n范围在[1, 1000000]之间

这道题显然是要用到动态规划,而且与爬楼梯的另一道题基本一样,只是多了可以一次爬三层而已

另一道爬楼梯可以看下面的链接

https://blog.csdn.net/stackempty2/article/details/106622641

**

细节在于取模,如果对dp[i-1],dp[i-2],dp[i-3]都依次取模,结果依然可能越界,因为如果每个数都是比1000000007小一点点,那么相加后依然越界,所以应该先让两个相加,再取模,这样保证会被取余,就不存在越界情况了

**

class Solution {
    public int waysToStep(int n) {
             if(n==1) return 1;
             if(n==2) return 2;
             if(n==3) return 4;
             int []dp=new int[n+1];
             dp[1]=1;
             dp[2]=2;
             dp[3]=4;
             for(int i=4;i<=n;i++){
                 dp[i]=((dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007;
             }
             return dp[n]%1000000007;
    }
}