每日一道算法题018 爬楼梯

110 阅读2分钟

题目

leetCode 第 70 题,爬楼梯
关联类型:动态规划

假设你正在爬楼梯。需要 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) {
      
      
      
    }
}

以上给出方法输入参数,完成作答。

题目分析

  1. 刚开始这个题不知道咋解,那就写前几个找规律
  2. 1->1
    2->2
    3->3
    4->5
    5->8
  3. 相信你已经看出来了,从 3 开始,f(x)=f(x-1)+f(x-2);
  4. 然后睿智的我就想直接用递归解决了,然后,然后超时了。。。代码如下,仅供参考
  5. 后来想到直接用 for 循环去做,定义变量记录,然后叠加即可

解答分析

本文只分析本人做题思路,仅供参考,了解一种解题思想,其他各种做题思路请上网查阅。

运行失败:
Time Limit Exceeded
测试用例:45

//使用递归,然后超时了
class Solution {
    public int climbStairs(int n) {
        if (n == 1 || n == 2) {
            return n;
        } else {
            return climbStairs(n - 1) + climbStairs(n - 2);
        }
    }
}

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:35.4 MB,击败了11.44% 的Java用户

class Solution {
    public int climbStairs(int n) {
        //left 相当于 x-2,right 相当于 x-1,res 则是 x
        //初始赋值如下
        int left = 0, right = 1, res = 0;
        for (int i = 0; i < n; i++) {
            //f(x) = f(x-1) + f(x-2)
            res = left + right;
            //将 x-1 的值赋值给 x-2
            left = right;
            //将 x 的值赋值给 x-1
            right = res;
        }
        return res;
    }
}