LeetCode - Climbing Stairs
问题描述: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 };