首页 > 代码库 > LeetCode 70 Climbing Stairs
LeetCode 70 Climbing Stairs
Problem:
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?
Summary:
n级楼梯,每次上1或2阶,求共有多少种不同的上法。
Analysis:
这道题实际上为斐波那契数列,有以下几种解法。
1. 递归
首先想到的是递归写法,一次上1阶和2阶是两种不同方法,所以上n级楼梯:
- 若最后一步上了1阶,则共有climbStairs(n - 1)种方法。
- 若最后一步上了2阶,则共有climbStairs(n - 2)种方法。
对于每一步,都有以上两种不同考虑。
但递归写法效率太低,TLE。。
1 class Solution { 2 public: 3 int climbStairs(int n) { 4 if (n == 1) return 1; 5 if (n == 2) return 2; 6 return climbStairs(n - 2) + climbStairs(n - 1); 7 } 8 };
2. 思路同上一种方法,改用了动态规划,节省了时间。
1 class Solution { 2 public: 3 int climbStairs(int n) { 4 int *steps = new int[n + 1]; 5 steps[0] = 1; steps[1] = 1; steps[2] = 2; 6 7 for (int i = 3; i < n + 1; i++) { 8 steps[i] = steps[i - 1] + steps[i - 2]; 9 } 10 11 return steps[n]; 12 } 13 };
3. 下面两种方法参考 http://blog.csdn.net/kenden23/article/details/17377869 在动态规划的基础上节省空间。
1 class Solution { 2 public: 3 int climbStairs(int n) { 4 int steps[3]; 5 steps[0] = 1; steps[1] = 1; 6 7 for (int i = 2; i < n + 1; i++) { 8 steps[i % 3] = steps[(i - 1) % 3] + steps[(i - 2) % 3]; 9 } 10 11 return steps[n % 3]; 12 } 13 };
或者不开数组,直接用三个变量解决问题
1 class Solution { 2 public: 3 int climbStairs(int n) { 4 if (n <= 2) return n; 5 int a = 1, b = 1, c = 2; 6 7 for (int i = 3; i < n + 1; i++) { 8 a = b; 9 b = c; 10 c = a + b; 11 } 12 13 return c; 14 } 15 };
LeetCode 70 Climbing Stairs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。