leetcode70:爬楼梯

原题地址:70. 爬楼梯 - 力扣(LeetCode)

题目描述

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

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

示例 1:

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

示例 2:

复制代码
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

解题思路

这道题的目标是解决经典的"爬楼梯"问题,即给定楼梯的总阶数 n,每次只能爬 1 或 2 阶,求总共有多少种不同的爬法。

背景知识:

  • 爬楼梯问题与斐波那契数列密切相关,f(n) = f(n-1) + f(n-2),初始条件为 f(1) = 1, f(2) = 2
  • 通过矩阵快速幂,可以在对数时间内求解斐波那契数列问题,利用状态转移矩阵:Q=1110Q=1110 斐波那契数列可以表示为:Fibonacci(n)=Q(n−1)00Fibonacci(n)=Q(n−1)00

源码实现

复制代码
class Solution {
    public int climbStairs(int n) {
        // 定义状态转移矩阵 Q
        int[][] q = {{1, 1}, {1, 0}};
        // 计算矩阵 Q 的 n 次幂,得到爬楼梯的结果
        int[][] res = pow(q, n);
        // 返回结果矩阵的左上角元素,即 f(n)
        return res[0][0];
    }

    // 矩阵快速幂方法
    public int[][] pow(int[][] a, int n) {
        // 初始化单位矩阵 I,用于保存中间结果
        int[][] ret = {{1, 0}, {0, 1}};
        while (n > 0) {
            // 如果 n 是奇数,累乘当前矩阵
            if ((n & 1) == 1) {
                ret = multiply(ret, a);
            }
            // 更新矩阵 a 为其自身的平方
            a = multiply(a, a);
            // n 右移一位,相当于整除 2
            n >>= 1;
        }
        // 返回结果矩阵
        return ret;
    }

    // 矩阵乘法方法
    public int[][] multiply(int[][] a, int[][] b) {
        // 初始化结果矩阵
        int[][] c = new int[2][2];
        // 两个 2x2 矩阵逐元素相乘并累加
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j];
            }
        }
        // 返回乘积矩阵
        return c;
    }
}

复杂度分析

时间复杂度:
  1. 矩阵乘法复杂度:
    • 两个 2x2 矩阵相乘需要进行常数次(4 次)乘法和加法操作,时间复杂度为 O(1)O(1)。
  2. 矩阵快速幂复杂度:
    • 快速幂的时间复杂度为 O(log⁡n)O(logn),因为每次将 n 除以 2,最多需要 O(log⁡n)O(logn) 次矩阵平方操作。
  3. 总复杂度:
    • 因此,算法的时间复杂度为:O(log⁡n)O(logn)
空间复杂度:
  • 使用了两个 2x2 的矩阵 reta,以及一个临时矩阵 c,因此空间复杂度为常数 O(1)O(1)。
相关推荐
天天喝旺仔13 分钟前
Git 内部原理深度解析:从 blob/tree/commit 对象到 packfile 与垃圾回收
数据结构·数据库·git·算法·哈希
AIGCmagic社区15 分钟前
KITTI AbsRel从6.5压到5.4,Marigold V2用一张32GB卡把编辑DiT收成单步深度估计
人工智能·算法·aigc·ai多模态
青少儿编程课堂16 分钟前
多源最短路与最小环(Floyd 算法图论解析)
c++·python·算法·bfs·信息学竞赛
6Hzlia24 分钟前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode
Edward The Bunny38 分钟前
Leetcode Hot 100
数据结构·算法
hans汉斯41 分钟前
数据挖掘|基于BP神经网络的少数民族村寨文化型旅游体验产品潜在游客挖掘
深度学习·神经网络·算法·yolo·软件工程·bp·汉斯出版社
v_348360876210 小时前
Android native端 堆栈打印
android·算法
residual_fan10 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea11 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询12 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法