C++爬楼梯(青蛙跳台阶)
Posted 久病成良医
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++爬楼梯(青蛙跳台阶)相关的知识,希望对你有一定的参考价值。
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶
递归解法
class Solution {
public int climbStairs(int n) {
// 递归终止条件
if(n == 1 || n == 2) return n;
// 当前递归层的逻辑处理 加法
// 进入下一层递归 climbStairs(n - 1) 和 climbStairs(n - 2)
return climbStairs(n - 1) + climbStairs(n - 2);
}
}
时间复杂度: O(2^n) ,每一层递归的复杂度是上一层递归的2倍
空间复杂度: O(n) , n是递归的层次
以下图中计算5为例, 递归的层次是5层,顶层是1,没深入一层,算法的复杂度乘以2。
分析发现,递归解法中存在重复计算(比如下图中标注的),那么我们可以减少重复计算,将计算的结果保存起来,再次有相关计算的时候,直接从缓存中读取。
递归优化
class Solution {
public:
unordered_map<int,int> mp; //哈希表一定要建在函数的外面,如果建在函数里面,递归会一直调用这个函数
int climbStairs(int n) { //斐波那契
//unordered_map<int,int> mp; 哈希表放在这里不可以,会超出时间限制
if(n==1 || n==2) return n;
auto it = mp.find(n);
if(it!=mp.end()){ //查找n在不在mp里
return it->second; //return ->second错误,要有it
}
int sum = climbStairs(n-1) + climbStairs(n-2);
mp.insert(pair<int,int>(n,sum)); //<>和()之间没有逗号 <int,int>,(n,sum) 错误
return sum;
}
};
以上是关于C++爬楼梯(青蛙跳台阶)的主要内容,如果未能解决你的问题,请参考以下文章