力扣(LeetCode)——70. 爬楼梯

一、题目描述

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

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

二、测试用例

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1+ 12. 2

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1+ 1+ 12. 1+ 23. 2+ 1

二、解题思路

  1. 基本思路:记爬 2 个台阶的个数为 k ,该题目可以转化为计算 k = 0,1,2,…,的方案数,例如:k = 0,表示每次只爬一个台阶,方案数为 C n − k k = C n 0 = 1 C_{n-k}^k=C_n^0=1 Cnkk=Cn0=1 ;k = 1 ,表示有一次是爬两个台阶,其他都是爬一个台阶,方案数就是 C n − k k = C n − 1 1 = n − 1 C_{n-k}^k=C_{n-1}^1=n-1 Cnkk=Cn11=n1 ,依次类推,总方案数就是 ∑ k = 0 n 2 C n − k k \sum_{k=0}^{\frac n2}C_{n-k}^k k=02nCnkk
  2. 具体思路:
    • 暴力解:写一个函数计算 C n k = n ( n − 1 ) ⋯ ( n − k + 1 ) k ! C_n^k=\frac{n(n-1)\cdots(n-k+1)}{k!} Cnk=k!n(n1)(nk+1)
    • 动态规划:计算 C n k C_n^k Cnk 表,其中 C n k = C n − 1 k − 1 + c n − 1 k C_n^k=C_{n-1}^{k-1}+c_{n-1}^k Cnk=Cn1k1+cn1k

三、参考代码

3.1 暴力解

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

数据可能会溢出

// 计算cnk,k 表示爬 2 个楼梯的个数,n 表示楼梯总数 - k
int c(int k,int n){
    long long int a=1,b=1;
    for(int i=0;i<k;i++){
        a*=n-i;
        b*=k-i;
    }
    return a/b;
}

int climbStairs(int n) {
    int sum=0;
    for(int i=0;2*i<=n;i++){
        sum+=c(i,n-i);
    }
    return sum;
}

3.2 动态规划

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

const static int max=45;
long c[max+1][max+1];
// dp方法,核心是 c[n][k]=c[n-1][k-1]+c[n-1][k]
void compute_c(){
    for(int i=0;i<=max;i++){  
        c[i][0]=c[i][i]=1;
    }
    for(int n=1;n<=max;n++){
        for(int k=1;k<n;k++){
            c[n][k]=c[n-1][k-1]+c[n-1][k];
        }
    }
}
int climbStairs(int n) {
    int sum=0;
    compute_c();
    for(int i=0;2*i<=n;i++){
        sum+=c[n-i][i];
    }
    return sum;
}

相关推荐

  1. (LeetCode)——70. 楼梯

    2024-07-20 15:34:01       23 阅读
  2. 70. 楼梯

    2024-07-20 15:34:01       65 阅读
  3. 70.楼梯

    2024-07-20 15:34:01       28 阅读
  4. 70. 楼梯

    2024-07-20 15:34:01       29 阅读
  5. 70. 楼梯

    2024-07-20 15:34:01       27 阅读
  6. LeetCode 70. 楼梯

    2024-07-20 15:34:01       69 阅读
  7. Leetcode 70 楼梯

    2024-07-20 15:34:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 15:34:01       104 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 15:34:01       115 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 15:34:01       94 阅读
  4. Python语言-面向对象

    2024-07-20 15:34:01       100 阅读

热门阅读

  1. 如何使用fiddler 查看手机端数据包

    2024-07-20 15:34:01       26 阅读
  2. AI艺术创作:掌握Midjourney和DALL-E的技巧与策略

    2024-07-20 15:34:01       26 阅读
  3. 快速创建 vue 项目并添加 Dockerfile 文件

    2024-07-20 15:34:01       21 阅读
  4. C语言(7.4)

    2024-07-20 15:34:01       27 阅读
  5. 怎么降低美国服务器硬盘故障率?

    2024-07-20 15:34:01       27 阅读
  6. 智能听诊器:居家宠物健康管理新助手

    2024-07-20 15:34:01       25 阅读
  7. Springboo3中使用虚线程

    2024-07-20 15:34:01       24 阅读
  8. C#面:MVC中的TempData\ViewBag\ViewData区别?

    2024-07-20 15:34:01       29 阅读