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,因此整个算法的时间复杂度为O(n)。在我的代码里面用了一个容器来存储爬到每一个台阶可以用的方法数,事实上是不用的,只需要知道前两个台阶所用的方法数即可。所以最少的空间复杂度为O(1)

0 0
原创粉丝点击