zoukankan      html  css  js  c++  java
  • 【LeetCode练习题】Climbing Stairs

    Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top.

    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

    题目意思:

    上楼梯。假设要n步到达楼梯的顶部。每一次你只能上一个或两级台阶,问要到达顶部一共有多少种方法?

    解题思路:

    真是太巧了!!我今天刚刚在《剑指offer》里读到了一模一样的原题,在该书的75页。简单介绍一下吧:

    如果只有一级台阶,那显然只有一种方法。如果有2级台阶,那就有两种上的方法了:一种是分两次,每次上一级;另外一种就是一次上2级。

    接着讨论一般情况,我们把n级台阶时的方法数看成是n的函数,记为f(n)。当n>2时,第一次上的时候就有两种不同的选择:一是第一次只登一级,此时登法数目等于后面剩下的n-1级台阶的登法数目,即f(n-1);另外一种选择是第一次上2级,此时方法数目等于后面剩下的n-2级台阶的方法数目,即f(n-2)。因此n级台阶的不同登法总数等于f(n-1)+f(n-2)。不难看出这实际上就是斐波那契数列了。

    注:因为斐波那契解法大都采用递归,实际上递归的解法存在很严重的效率问题,有大量的重复计算。当要计算的数很大时,速度极慢且有可能出现函数调用栈溢出的情况。所以实用的解法是采用循环,时间复杂度是O(n)。

    代码如下:

     1 class Solution {
     2 public:
     3     int climbStairs(int n) {
     4         return Fibonacci(n);
     5     }
     6     
     7     int Fibonacci(int n){
     8         int result[2] = {1,2};
     9         if(n < 3){
    10             return result[n-1];
    11         }
    12         
    13         int NminusOne = 2;
    14         int NminusTwo = 1;
    15         int N = 0;
    16         for(int i = 3; i <= n; i++){
    17             N = NminusOne + NminusTwo;
    18             
    19             NminusTwo = NminusOne;
    20             NminusOne = N;
    21         }
    22         return N;
    23     }
    24 };
  • 相关阅读:
    软件测试
    python学习之路
    好用的在线画图工具processon
    spring-boot集成dubbo
    公众号开放,关注软件开发过程中的哪些坑
    crontab 中curl命令无法正常执行
    近一月翻阅资料小结
    nginx+tomat8负载后,利用redis实现tomcat8的session共享
    centos7 安装nginx
    centos 上安装redis 3.0.5
  • 原文地址:https://www.cnblogs.com/4everlove/p/3645636.html
Copyright © 2011-2022 走看看