Leetcode算法初学——动态规划算法“爬楼梯”

题目描述:

假设你正在爬楼梯。需要 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 阶

题解:

  刚开始看到本题时,第一反应是用递归来做,由上到下,第10层是第9层的走法加上第8层的走法,所以f(x)=f(x-1)+f(x-2),依次递归算出f(x)的值

 

 1 using namespace std;
 2 class Solution {
 3 public:
 4     int climbStairs(int n) {
 5         if(n==0)
 6         {
 7             return 0;
 8         }
 9         if(n==1)
10         {
11             return 1;
12         }
13         if(n==2)
14         {
15             return 2;
16         }
17         return climbStairs(n-1)+climbStairs(n-2);
18     }
19 };

 

  但是在提交测试的时候测试到44就超出了时间限制,想了一下发现递归就是一直在遍历二叉树的值,哪怕之前已经检查过了还是会往下遍历一遍,时间复杂度为O(2n),于是想到了动态规划从下往上走,已知1阶台阶只有一种走法,2阶台阶有两种走法,设立数组db[]将db[1]和db[2]赋值,因为开辟空间默认值为0,所以不用给db[0]也赋值,然后设立循环,从3开始依次往上走,走到n,这样就可以避免递归多次遍历浪费时间

 1 class Solution {
 2 public:
 3     int climbStairs(int n) {
 4        if(n==1)
 5        {
 6            return 1;
 7        }
 8        int db[n+1];
 9        db[1]=1;
10        db[2]=2;
11        for(int i=3;i<=n;i++)
12        {
13            db[i]=db[i-1]+db[i-2];
14        }
15        return db[n];
16     }
17 };

顺利通过用例检测。时间复杂度为O(n)。

 

posted @ 2020-06-14 11:07  菲特涅米  阅读(449)  评论(0编辑  收藏  举报