剑指Offer10-II.青蛙跳台阶问题 C++

1、题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1
输入:n = 2
输出:2
示例 2
输入:n = 7
输出:21
示例 3
输入:n = 0
输出:1

2、VS2019上运行

递推法

#include 

class Solution {
public:
    int numWays(int n) {
        if (n == 0)
            return 1; // 没有台阶,直接在上面,一种方法
        else if (n <= 2)
            return n; // 一个或两个台阶
        int a = 1, b = 2, c = 0; // a保存f(n-2), b保存f(n-1), c保存f(n)
        for (int i = 3; i <= n; ++i) // i:第i个台阶
        {
            c = (a + b) % 1000000007; // 第i个台阶跳法:a:i-2个台阶跳法,b:i-1个台阶跳法
            a = b; // a保存b
            b = c; // b保存c
        }
        return c;
    }
};

int main() {
    int n = 7;
    Solution s;
    int ways = s.numWays(n);
    std::cout << "Number of ways to climb " << n << " stairs: " << ways << std::endl;
    return 0;
}

运行结果:
Number of ways to climb 7 stairs: 21

3、解题思路

青蛙跳台阶

  • 1.首先,判断特殊情况。如果 n=0,说明没有台阶需要跳,直接返回 1,表示一种方法。
  • 2.接下来,处理 n 小于等于 2 的情况。这是因为青蛙一次可以跳一级或两级的台阶,所以当 n 等于 1 或 2 时,分别只有一种和两种方法可以到达目标位置,直接返回对应的台阶数。
  • 3.对于 n 大于等于 3 的情况,采用动态规划的方法求解。定义三个变量 a、b 和 c,分别表示 f(n-2)、f(n-1) 和 f(n),其中 f(n) 表示跳上第 n 级台阶的方法数。
  • 4.利用循环从第 3 级台阶开始计算并更新 a、b 和 c 的值。根据动态规划的思想,f(n) 的值由前两项 f(n-2) 和 f(n-1) 的值决定。具体计算方法为 c = (a + b) % 1000000007,这是为了防止结果过大导致整数溢出。
  • 5.循环结束后,c 的值即为跳上第 n 级台阶的方法数,将其作为函数的返回值。

你可能感兴趣的:(剑指Offer刷题,c++,开发语言,力扣)