题目描述
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果取模1000000007。
代码实现
解法1
//时间复杂度o(n) 空间复杂度o(n)
class Solution {
public:
int waysToStep(int n) {
vector<int> dp(n+1,0);
if(n<3)
return n;
dp[0]=1;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
{
dp[i]=((dp[i-1]+dp[i-2])%1000000007+dp[i-3])%1000000007;
}
return dp[n];
}
};
解法2
//时间复杂度o(n) 空间复杂度o(1)
public int waysToStep(int n) {
if (n < 2) return n;
long dp0 = 1, dp1 = 1, dp2 = 2;
for (int i = 3; i <= n; i++) {
long temp = (dp0 + dp1 + dp2) % 1000000007;
dp0 = dp1 % 1000000007;
dp1 = dp2 % 1000000007;
dp2 = temp;
}
return (int) dp2;
}