精选力扣500题 第57题 LeetCode 70. 爬楼梯【c++/java详细题解】

目录

      • 1、题目
      • 2、思路
      • 3、c++代码
      • 4、java代码

1、题目

假设你正在爬楼梯。需要 n阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意: 给定 n是一个正整数。

示例 1:

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

1.  1 阶 + 1 阶
2.  2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

2、思路

(递推) O ( n ) O(n) O(n)

分析题目可以发现:

  • 上 1 阶台阶:有1种方式。

  • 上 2 阶台阶:有1+1和2两种方式。

  • 上 3 阶台阶:到达第3阶的方法总数就是到第1阶和第2阶的方法数之和。

  • 上 n 阶台阶,到达第n阶的方法总数就是到第 (n-1) 阶和第 (n-2) 阶的方法数之和。

因此,定义数组 f[i] 表示上i 级台阶的方案数,则枚举最后一步是上1级台阶,还是上2级台阶,所以有:
f[i] = f[i−1]+f[i−2]
精选力扣500题 第57题 LeetCode 70. 爬楼梯【c++/java详细题解】_第1张图片
时间复杂度分析: 递推状态数 O ( n ) O(n) O(n),转移时间复杂度是 O ( 1 ) O(1) O(1),所以总时间复杂度是 O ( n ) O(n) O(n)

3、c++代码

class Solution {
public:
    int climbStairs(int n) {
        if( n <= 2) return n;
        vector<int> f(n + 1);
        f[1] = 1;
        f[2] = 2;
        for(int i = 3; i <= n; i++)
        {
            f[i] = f[i-1] + f[i-2];
        }
        return f[n];
    }
};

4、java代码

class Solution {
    public int climbStairs(int n) {
         if( n <= 2) return n;
         int[] f = new int[ n + 1];
         f[1] = 1;
         f[2] = 2;
         for(int i = 3; i <= n; i++)
         {
            f[i] = f[i-1] + f[i-2];
         }
         return f[n];
    }
}

原题链接:70. 爬楼梯
精选力扣500题 第57题 LeetCode 70. 爬楼梯【c++/java详细题解】_第2张图片

你可能感兴趣的:(LeetCode题解,动态规划,递推,leetcode,数据结构与算法,高频面试题)