LeetCode——Climbing Stairs
来源:互联网 发布:手机淘宝怎么没有直播 编辑:程序博客网 时间:2024/05/29 09:32
LeetCode——Climbing Stairs
# 70
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?
Note: Given n will be a positive integer.
这个问题是给定一个n,通过用不同个数的1或2,相加可以得到n的情况个数。其实就是一个斐波那契的数列问题。一开始我拿到题目,就直接通过正常思路写。我用了递归来解决这个问题。代码非常的简单,但是当输入值太大,递归所用的时间太长,在LeetCode上是通过不了的。
- C++
class Solution{public: int climbStairs(int n){ if(n == 1) return 1; if(n == 2) return 2; //当n为2时,有两种方法,两个1或者2 return climbStairs(n - 1) + climbStairs(n - 2); }
这里的递归思想其实很容易理解。但熟用递归思想去考虑题目还是需要训练的。可以将这个代码进行改写。
- C++解法二
class Solution {public: int climbStairs(int n) { int f1,f2; f1 = 1; f2 = 2; if(n == 1) return f1; if(n == 2) return f2; int fn; for(int i = 3;i <= n;i++) { fn = f1 + f2; f1 = f2; f2 = fn; } return fn; }};
这样写当然是没问题的,我去找了其他人的答案看了下,用到了动态规划法填表,跟递归其实差不多,使用了一个vector数组,动态性地提高了效率。这两个解法的效率其实差不多。下面的代码看起来更加简洁。
- C++解法三
class Solution {public: int climbStairs(int n) { if (n <= 1) return 1; vector<int> f(n+1); f[0] = 1; f[1] = 1; for (int i = 2; i <= n; ++i) { f[i] = f[i - 1] + f[i - 2]; } return f.back(); //返回最后一个元素 }};
- C++解法四
只用两个整型变量,进一步优化空间。参考解法二,是对算法二的优化。
class Solution {public: int climbStairs(int n) { int a = 1, b = 1; while (n--) { b += a; //b就是解法二中的fn a = b - a; } return a; }};
看到另一种解法二的写法,也是动态规划的方法,对空间进行了优化。
- C++解法五
这是对算法三的空间优化。
class Solution {public: int climbStairs(int n) { vector<int> f(3); f[0] = 1; f[1] = 1; for (int i = 2; i <= n; i++) { f[i%3] = f[(i-1)%3] + f[(i-2)%3]; } return f[n%3]; } };
写一下对应解法三的Java形式。
- Java
public class Solution { public int climbStairs(int n) { if (n <= 1) return 1; int[] f = new int[n+1]; f[0] = 1; f[1] = 1; for (int i = 2; i <= n; i++) { f[i] = f[i - 1] + f[i - 2]; } return f[n]; }}
再写一下Python的形式。
- Python
class Solution: # @param n, an integer # @return an integer def climbStairs(self, n): f = [1 for i in range(n+1)] for i in range(2, n+1): f[i] = f[i-1] + f[i-2] return f[n]
Python在初始化上简单了一点。其他都差不多。
阅读全文
0 0
- LeetCode——Climbing Stairs
- LeetCode——Climbing Stairs
- LeetCode——Climbing Stairs
- leetcode——Climbing Stairs
- LeetCode——Climbing Stairs
- Python学习——leetcode(Climbing Stairs)
- leetcode 070 —— Climbing Stairs
- LeetCode —— 70. Climbing Stairs
- leetcode——70——Climbing Stairs
- leetcode由易入难——【3】Climbing Stairs
- LeetCode学习篇十九——Climbing Stairs
- leetcode刷题之旅——70. Climbing Stairs
- LeetCode 70. Climbing Stairs 题解 —— Java
- LeetCode 70 — Climbing Stairs(C++ Java Python)
- LeetCode70——Climbing Stairs
- LeetCode70——Climbing Stairs
- DP——Climbing Stairs
- Algorithms—70.Climbing Stairs
- 约瑟夫环问题用Python的解法
- Python实现 Pat1019 数字黑洞
- js事件机制
- Vue2中的键盘事件
- Java8函数式编程之七:Stream(流)的各种操作
- LeetCode——Climbing Stairs
- 初识多线程
- 2017.11.1总结
- 字典树的实现
- 完美世界校招在线笔试题-互联网Java(11月1日)编程题
- 弹球游戏实验:Ball_Game v1.0
- 微服务(Microservices)- 文章翻译
- 自学数据库E-R图
- python核心编程课后习题-正则式2