[杨小白]_java_leetcode 70.爬楼梯

105 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

70.爬楼梯

70. 爬楼梯

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

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

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

示例1

输入: n = 2

输出: 2

解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶

  2. 2 阶

示例2

输入: n = 3

输出: 3

解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶

  2. 1 阶 + 2 阶

  3. 2 阶 + 1 阶

2.解析

昨天写了斐波那契数,分享了两个做法,递归和记忆数组。这个题和斐波那契是一样的做法,但是这题n的范围是从1-45,当输入45的时候,就会超时。

2.1解法(递归)

最容易想到的解法那就是递归求解。代码简洁,易懂。但是递归在数目较大情况下经常会出现栈溢出的情况。空间复杂度O(n),时间复杂度O(2^n)。

class Solution {
    public int climbStairs(int n) {
        if(n==1) return 1;
        if(n==2) return 2;
        return climbStairs(n-1) + climbStairs(n-2);
    }
}

提交结果

时间超出限制

image.png

2.2解法(记忆数组)

在解法1的基础上进一步思考,能否用O(n)的时间复杂度完成呢?

这里用db记忆数组,实现时间复杂度O(n),空间复杂度也是O(n),也完美的解决了栈溢出。

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

提交排名

image.png

3.结束

递归是经常会遇到的一种算法题型,那么如果都引入一个记忆数组db,就可以大大减少算法时间复杂度,也会减少栈溢出的风险。这个题的测试数据中,输入最大的45时,就会出现时间溢出。减少递归。