Leetcode初学——动态规划算法“三步问题”
题目
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
n范围在[1, 1000000]之间
题解
小朋友做错了什么要这么为难小朋友。。。。。。这道题做过爬楼梯的很好解,动态规划方程与爬楼梯几乎相同f(x)=f(x-1)+f(x-2)+f(x-3),解出动态规划方程以后很容易就能把这道题写出来,但是本道题标签虽为简单,却比一些中等难度的题通过率都低,提交次数30368,通过次数10451,通过率30%左右,之所以这么简单还这么低的通过率完全就是因为坑爹的范围,我开始没有审题疯狂溢出,这道题就是在数值范围上坑了很多人。
1 class Solution { 2 public: 3 int waysToStep(int n) { 4 int dp0,dp1,dp2,dp=0; 5 dp0=1; 6 dp1=2; 7 dp2=4; 8 if(n==0) 9 { 10 return 0; 11 } 12 else if(n==1) 13 { 14 return dp0; 15 } 16 else if(n==2) 17 { 18 return dp1; 19 } 20 else if(n==3) 21 { 22 return dp2; 23 } 24 for(int i=3;i<n;i++) 25 { 26 if(i>3){dp0=dp1;dp1=dp2;dp2=dp;} 27 dp=((dp0+dp1)%1000000007+dp2)%1000000007; 28 } 29 return dp%1000000007; 30 } 31 };
顺利通过:
算法时间复杂度O(n),空间复杂度O(1),当然也可以用数组来做,数组就不用再交换数字了,时间可能会节省一些,但是我的算法比较节省空间,各有利弊吧。