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)。