LeetCode

问题描述:n个台阶,每次只能跨1个或者2个,求有多少种方法。

ways[i]:i个台阶的方法。可能是由i-1个台阶跨1个或者由i-2个台阶,转化为斐波那契数列,即

1 int climbStairs(int n)
2 {
3     if (n == 1)
4         return 1;
5     else if (n == 2)
6         return 2;
7     else
8         return climbStairs(n-1) + climbStairs(n-2);
9 }

递归效率太低,重复计算了很多分支,使用动态规划法填表,提高效率,程序也很简单:

 1 class Solution {
 2 public:
 3     int climbStairs(int n) {
 4         int ways[n+1];
 5         ways[1] = 1;
 6         ways[2] = 2;
 7         for (int i = 3; i <= n; i++)
 8         {
 9             ways[i] = ways[i-2] + ways[i-1];
10         }
11         return ways[n];
12     }
13 };

还可以采用如下方法节约空间:

 1 class Solution {
 2 public:
 3     int climbStairs(int n) {
 4         int ways[3];
 5         ways[0] = 1;
 6         ways[1] = 1;
 7         for (int i = 2; i <= n; i++)
 8         {
 9             ways[i%3] = ways[(i-2)%3] + ways[(i-1)%3];
10         }
11         return ways[n%3];
12     }
13 };
原文地址:https://www.cnblogs.com/bournet/p/4109897.html