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),当然也可以用数组来做,数组就不用再交换数字了,时间可能会节省一些,但是我的算法比较节省空间,各有利弊吧。

猜你喜欢

转载自www.cnblogs.com/feite/p/13184857.html