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];
}
反思:
正确理解题意即可