【Leecode】Leecode刷题之路第70天之爬楼梯

Scroll Down

题目出处

70-爬楼梯-题目出处

题目描述

70-爬楼梯-题目描述

个人解法

思路:

todo

代码示例:(Java)

todo

复杂度分析

todo

官方解法

70-爬楼梯-官方解法

方法1:动态规划

思路:

70-爬楼梯-动态规划-思路1
70-爬楼梯-动态规划-思路2(减少帧数后2)

代码示例:(Java)

public class Solution1 {
    public int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q;
            q = r;
            r = p + q;
        }
        return r;
    }


}

复杂度分析

  • 时间复杂度:循环执行 n 次,每次花费常数的时间代价,故渐进时间复杂度为 O(n)。
  • 空间复杂度:这里只用了常数个变量作为辅助空间,故渐进空间复杂度为 O(1)。

方法2:矩阵快速幂

思路:

70-爬楼梯-矩阵快速幂-思路1
70-爬楼梯-矩阵快速幂-思路2

代码示例:(Java)

public class Solution2 {
    public int climbStairs(int n) {
        int[][] q = {{1, 1}, {1, 0}};
        int[][] res = pow(q, n);
        return res[0][0];
    }

    public int[][] pow(int[][] a, int n) {
        int[][] ret = {{1, 0}, {0, 1}};
        while (n > 0) {
            if ((n & 1) == 1) {
                ret = multiply(ret, a);
            }
            n >>= 1;
            a = multiply(a, a);
        }
        return ret;
    }

    public int[][] multiply(int[][] a, int[][] b) {
        int[][] c = new int[2][2];
        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;
    }


}

复杂度分析

  • 时间复杂度:同快速幂,O(logn)。
  • 空间复杂度:O(1)。

方法3:通项公式

思路:

70-爬楼梯-通项公式-思路

代码示例:(Java)

public class Solution3 {
    public int climbStairs(int n) {
        double sqrt5 = Math.sqrt(5);
        double fibn = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);
        return (int) Math.round(fibn / sqrt5);
    }


}

复杂度分析

  • 代码中使用的 pow 函数的时空复杂度与 CPU 支持的指令集相关,这里不深入分析。

总结

70-爬楼梯-官方题解-总结

考察知识点

收获

1.斐波那契数列

2.通项公式

3.矩阵

4.幂

Gitee源码位置

70-爬楼梯-源码

同名文章,已同步发表于CSDN,个人网站,公众号