Easy!

题目描述:

假设你正在爬楼梯。需要 n 步你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 步 + 1 步
2. 2 步

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 步 + 1 步 + 1 步
2. 1 步 + 2 步
3. 2 步 + 1 步

解题思路:

这道题目实际上跟斐波那契数列非常相似,假设梯子有n层,那么如何爬到第n层呢,因为每次只能爬1或2步,那么爬到第n层的方法要么是从第n-1层一步上来的,要不就是从n-2层2步上来的,所以递推公式非常容易的就得出了:dp[n] = dp[n-1] + dp[n-2]。 由于斐波那契额数列的求解可以用递归,所以最先尝试了递归,拿到OJ上运行,显示Time Limit Exceeded,就是说运行时间超了,因为递归计算了很多分支,效率很低,这里需要用动态规划 (Dynamic Programming) 来提高效率,代码如下:

C++解法一:

 class Solution {
public:
int climbStairs(int n) {
if (n <= ) return ;
vector<int> dp(n);
dp[] = ; dp[] = ;
for (int i = ; i < n; ++i) {
dp[i] = dp[i - ] + dp[i - ];
}
return dp.back();
}
};

我们可以对空间进行进一步优化,我们只用两个整型变量a和b来存储过程值,首先将a+b的值赋给b,然后a赋值为原来的b,所以应该赋值为b-a即可。这样就模拟了上面累加的过程,而不用存储所有的值。

C++解法二:

 class Solution {
public:
int climbStairs(int n) {
int a = , b = ;
while (n--) {
b += a;
a = b - a;
}
return a;
}
};

最新文章

  1. Web性能优化:基本思路和常用工具
  2. Js中变量的作用域
  3. Ubuntu安装Python2.7,nodejs
  4. ==与equal在java中应用的感悟
  5. Android:Java代码添加按钮
  6. C++中使用心得
  7. JPA学习---第八节:使用JPQL语句进行查询
  8. Ember.js demo5
  9. sublime3 插件pylinter的安装
  10. 数据库连接超时和go away、如何检测数据库的最大连接数
  11. Meterpreter
  12. IIS 7如何实现http重定向https
  13. css3 过渡和2d变换——回顾
  14. HTTP状态码作用
  15. python爬虫之xpath的基本使用
  16. Java try-cath-finally异常
  17. CMake--静态库与动态库构建
  18. C# SignalR 即时通信
  19. HDU 4656 Evaluation(MTT)
  20. JVM总结-java内存模型

热门文章

  1. git 重命名 origin
  2. Python 爬虫一 简介
  3. EL知识点总结
  4. 论文笔记系列-Multi-Fidelity Automatic Hyper-Parameter Tuning via Transfer Series Expansion
  5. EditText设置可以点击,但是不可以编辑
  6. ROI Pool和ROI Align
  7. c++学习day3(字符串_指针)
  8. JSLint报错翻译
  9. 华为QUIDWAY系列路由器的负载均衡配置
  10. 关于DateTime自带的AddSeconds等函数的坑