zoukankan      html  css  js  c++  java
  • LeetCode(70): 爬楼梯

    Easy!

    题目描述:

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

    解题思路:

    这道题目实际上跟斐波那契数列非常相似,假设梯子有n层,那么如何爬到第n层呢,因为每次只能爬1或2步,那么爬到第n层的方法要么是从第n-1层一步上来的,要不就是从n-2层2步上来的,所以递推公式非常容易的就得出了:dp[n] = dp[n-1] + dp[n-2]。 由于斐波那契额数列的求解可以用递归,所以最先尝试了递归,拿到OJ上运行,显示Time Limit Exceeded,就是说运行时间超了,因为递归计算了很多分支,效率很低,这里需要用动态规划 (Dynamic Programming) 来提高效率,代码如下:

    C++解法一:

     1 class Solution {
     2 public:
     3     int climbStairs(int n) {
     4         if (n <= 1) return 1;
     5         vector<int> dp(n);
     6         dp[0] = 1; dp[1] = 2;
     7         for (int i = 2; i < n; ++i) {
     8             dp[i] = dp[i - 1] + dp[i - 2];
     9         }
    10         return dp.back();
    11     }
    12 };

    我们可以对空间进行进一步优化,我们只用两个整型变量a和b来存储过程值,首先将a+b的值赋给b,然后a赋值为原来的b,所以应该赋值为b-a即可。这样就模拟了上面累加的过程,而不用存储所有的值。

    C++解法二:

     1 class Solution {
     2 public:
     3     int climbStairs(int n) {
     4         int a = 1, b = 1;
     5         while (n--) {
     6             b += a;
     7             a = b - a;
     8         }
     9         return a;
    10     }
    11 };
  • 相关阅读:
    (转)rename命令详解
    (转)CentOS 7系统详细开机启动流程和关机流程
    (转)Linux 开机引导和启动过程详解
    (转)Bash Shell常用快捷键
    (转)linux正则表达式详解
    (转)linux 中使用ls指定输出时间格式
    (转)用户管理 之 Linux 用户(user)和用户组(group)管理概述
    (转)Web服务器磁盘满故障深入解析
    详解MYSQL数据库密码的加密方式及破解方法
    php常见问题辨析(二)
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9153960.html
Copyright © 2011-2022 走看看