美文网首页
leetcode#70 爬楼梯

leetcode#70 爬楼梯

作者: leeehao | 来源:发表于2020-07-18 14:35 被阅读0次

题目

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

示例 1:

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

示例 2:

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

题目解析

爬楼梯是一道非常典型的题目,既然题目可以提出问题,那我们也可以向计算机提出问题,这是一道非常典型的递归题目。本题同斐波那契数列,青蛙跳台阶等为同类问题。

第一遍

暴力解答,简洁优雅,然而这种方式并不能满足时间复杂度,从计算规律来看重复计算的次数较多。

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

第二遍

将重复的计算缓存起来呢,可以通过遍历实现,也可以通过递归实现,限制于题目和作者懒癌症状,此次解法使用遍历实现。

class Solution {
    public int climbStairs(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        int[] mem = new int[n];
        mem[0] = 1;
        mem[1] = 2;
        for (int i = 2; i < n; i++) {
            mem[i] = mem[i - 1] + mem[i - 2];
        }
        return mem[n-1];
    }
}

第三遍

既然动态规划仅用到 i - 1 和 i - 2 那么不需要如此大的数组,仅需要保存前两项就好了。

class Solution {
    public int climbStairs(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        int a = 1, b = 2;
        for (int i = 2; i < n; i++) {
            int x = a + b;
            a = b;
            b = x;
        }
        return b;
    }
}

相关文章

网友评论

      本文标题:leetcode#70 爬楼梯

      本文链接:https://www.haomeiwen.com/subject/bjzxkktx.html