Climbing Stairs
来源:互联网 发布:灵格斯词霸 mac 编辑:程序博客网 时间:2024/06/06 00:41
Leetcode-Algorithm-DP-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?
(假定你正在爬楼梯,这个楼梯一共有n个台阶,而且你每一次只能爬1个或两个台阶。设计一个算法计算你有多少种不同的方法爬到楼梯的顶端。)
题解:
方法:(动态规划DP)
据题意,我们的目的是要找出所有不同的1和2的序列,使得这个序列的和等于n。那么这个问题的子问题就是,当爬到第i个台阶时,有多少种不同的爬法。这时有两种可能:①我们是用一步到达第i个台阶的,这个情况下,爬到第i个台阶的不同的方法数等于爬到第i-1个台阶的方法数;②我们是用两步到达第二个台阶的,这个情况下,爬到第i个台阶的不同的方法数等于爬到第i-2个台阶的方法数。由于这是两种不同的情况,因此爬到第i个台阶的总的不同的方法数是这两种情况的方法数之和。通过这样的方法可以求出爬到最顶层台阶的不同的方法数。所以用的是动态规划策略,假定f(i)表示爬到第i个台阶所用的不同的方法数,那么状态转移函数为f(i)=f(i-1)+f(i-2),初始条件f(1)=1, f(2)=1,最后所求得的f(n)就是我们的想要的答案。
值得注意的是,状态转移函数其实就是我们常见的求斐波那契数列所用的函数。
class Solution {public: int climbStairs(int n) { vector<int> allRes; allRes.push_back(0); for (int i = 1; i <= n; ++i) { if (i == 1) allRes.push_back(1); else if (i == 2) allRes.push_back(2); else allRes.push_back(allRes[i-1]+allRes[i-2]); } return allRes[n]; }};
分析:
由于整个算法只需要进行一次迭代,迭代的大小为n,因此整个算法的时间复杂度为
0 0
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Climbing Stairs
- Python学习笔记 --- 解析 type 和 object
- iOS点击短信中的链接跳转到App
- js进阶01.面向对象编程之女票的生产方法
- Windows安装rabbitmq
- java中Hashtable的使用案例及与HashMap的区别
- Climbing Stairs
- Redis 监控(Redis Monitoring)
- JDK自带工具keytool生成ssl证书
- Linux上安装JDK、Tomcat
- git将文件夹(整个项目)上传到github
- 从零开始学JAVA:java 静态导入 (import static) 详解
- 堆排序
- Hessian 原理分析、代码示例
- Asp.Net ListView+DataPager 的使用