Leetcode 面试题 08.01. 三步问题

 

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

示例1:

输入:n = 3
输出:4
说明: 有四种走法
示例2:

输入:n = 5
输出:13
提示:

n范围在[1, 1000000]之间

思路:

这个和之前蓝桥杯爬两个台阶的比较类似

因为三个台阶的话就是和n-1,n-2,n-3的台阶数有关系而已

因为最后的数字太大需要取模,这一步没有看到

正确代码:


int waysToStep(int n){
    if(n <= 2) return n;
    if (n == 3) return 4;
    int a = 1,b=2,c=4,d;

    /*已知条件有3条,因此共循环n-3次*/
    n -= 3;
    while(n--){
        d = ((a+b)%1000000007+c)%1000000007;
        a = b;
        b = c;
        c = d;
    }
    return c;
}

另外一种写法是用通常用到的dp数组的方法

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

 

  

 

反思:

正确理解题意即可

posted @ 2020-09-30 10:42  进寸欢喜  阅读(102)  评论(0编辑  收藏  举报