leetcode 70 Climbing Stairs
假设爬到楼顶需要走n步,n为正整数。你每次只能爬一步或者两步,请问有多少种爬法。
算法
利用动态规划解题,找出状态n和状态n-1之间的关系,即状态转移方程,然后从前往后遍历一遍,求得结果。
状态n和n-1的关系
n比n-1总步数多了一步,n的爬法种数可以从n-1的爬法种数得到:
- 在n-1的所有爬法后再加1步
- 把n-1的所有以1步结尾的爬法,把最后的1步变为2步
状态转移方程:
dp(n) = dp(n-1) + ew(n-1, 1) (n>=3)
2 (n=2)
1 (n=1)
其中ew(n-1, 1)表示总步数为n-1步时所有爬法中以1步结尾的爬法种数,
dp(n-1)表示总步数为n-1步时所有的爬法种数。
因此在从3到n遍历的过程中,我们只需要记住每个状态下的爬法种数,以及以1步结尾的爬法种数。
Code
class Solution {
public:
int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
int lastways=2;
int lastone=1;
for(int i=3; i<=n; i++){
int nowone = lastways, nowways = lastways + lastone;
lastways = nowways;
lastone = nowone;
}
return lastways;
}
};
算法时间复杂度:O(n)