202111-3更文-leetcode70:爬楼梯

141 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

leetcode70-爬楼梯

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

解题思路分析

解法1

根据题目所描述的要求,我们需要在台阶上爬楼梯。每一步可以选择爬一层或爬两层。而想要得到的内容则为共有多少种方法可以到达楼顶。首先可以退一步进行思考,如果想要到楼顶,需要从哪一层爬上去。由于只能爬一层或两层,则很容易知道我们需要到达n-1层或n-2层,才能到达楼顶。因此爬到楼顶的方法则转化为求有多少种方法能到达n-1层以及到达n-2层。只需要将二者相加即可得到目标结果。因此,该问题可以很容易想到动态规划的解题方案,利用n-1和n-2求出n。因此也就得到了状态转移方程,f(n) = f(n-1)+f(n-2)。同样的,想要得到目标结果,则需要首先对0,1,2进行单独的计算。处于优化角度考虑,将dp数组采用单个变量进行存储,只需要记录前两个节点的数据即可,变量循环使用。至此,题目内容已经解题完毕。

public int climbStairs(int n) {
    if(n == 0){
        return 0;
    }else if(n == 1){
        return 1;
    }else if(n == 2){
        return 2;
    }
    int[] list = new int[n + 1];
    list[0] = 0;
    list[1] = 1;
    list[2] = 2;
    for (int i = 3; i <= n; i++) {
        list[i] = list[i-1] + list[i-2];
    }
    return list[n];
}

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。