C++爬楼梯(青蛙跳台阶)

Posted 久病成良医

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++爬楼梯(青蛙跳台阶)相关的知识,希望对你有一定的参考价值。

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。

示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 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++爬楼梯(青蛙跳台阶)的主要内容,如果未能解决你的问题,请参考以下文章

20191026-跳台阶

青蛙变态跳台阶解法

C++ LeeCode 爬楼梯

C++ LeeCode 爬楼梯

[算法专栏] 爬楼梯问题

剑指offer--跳台阶(动态规划)