LeetCode 70 Climbing Stairs(爬楼梯)(动态规划)(*)
翻译
你正在爬一个楼梯。
它须要n步才干究竟顶部。
每次你能够爬1步或者2两步。
那么你有多少种不同的方法爬到顶部呢?
原文
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps.
In how many distinct ways can you climb to the top?
分析
动态规划基础题,首先设置3个变量用于转换:
int dp1 = 1, dp2 = 2, dpWay = 0;
依据题意,一次仅仅能是一步或两步。所以当n等于2时,有两种走法:1+1,2。
if (n <= 1) return dp1;
if (n == 2) return dp2;
从3開始,由于能够直接获得它的步数结果。所以直接写成:
while ((n--)-2) {
}
终于里面的变化方式为:
dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;
上一篇博客: LeetCode 206 Reverse Linked List(反转链表)(四步将递归改写成迭代)(*) ,介绍了怎样将递归改写成迭代,看过的童鞋应该会认为很easy的。那么这里再来转换一次:
int climbStairsIter(int n, int dpWay,int dp1, int dp2) {
if (n <= 1) return dp1;
if (n == 2) return dp2;
if ((n--) - 2) {
dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;
return climbStairsIter(n, dpWay, dp1, dp2);
}
else return dpWay;
}
int climbStairs(int n) {
return climbStairsIter(n, 0,1,2);
}
由于这里的參数涉及到运行前面顺序,所以不妨单独列出来了,只是这样看来略不简洁呐。
代码
class Solution {
public:
int climbStairs(int n) {
int dp1 = 1, dp2 = 2, dpWay = 0;
if (n <= 1) return dp1;
if (n == 2) return dp2;
while ((n--) - 2) {
dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;
}
return dpWay;
}
};