爬楼梯 Climbing-Stairs

题目

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

题目说明如下

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?

[!NOTE] Given n will be a positive integer.

Example 1:

Input: 2
Output: 2

Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

思路&题解

爬楼梯的流程类似于排列组合,如从5个球里面选2个有几种选法。N阶楼梯,爬上和爬下的方法数是一样。 对N阶,我们先走第一步,如果走一级,只需要考虑剩下n-1级的走法,如果走两级,只需考虑剩下n-2级的走法,

  • S(n) = S(n-1)+S(n-2)
  • S(2) = 2
  • S(1) = 1
  • S(0) = 0

结合这个思路,可以得到

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

如果直接提交这个算法,可能会失败,因为效率比较低,存在大量的递归重复计算

提交时间 状态 执行用时 内存消耗 语言
7 分钟前 通过 0 ms 32.1 MB java
8 分钟前 通过 0 ms 31.7 MB java
21 分钟前 超出时间限制 N/A N/A java

尝试缓存S(n)的结果,方便递归时直接复用已经计算过的阶梯数:

int[] cache;
public int climbStairs(int n) {
   if (cache==null){
       cache = new int[n+1];
   }
    if(n==0){
        return 0;
    } else if(n==1){
        return 1;
    } else if(n==2){
        return 2;
    } else {
        if(cache[n-1]<=0){
            cache[n-1] = climbStairs(n-1);
        }
        if(cache[n-2]<=0){
            cache[n-2]=climbStairs(n-2);
        }
        cache[n]= cache[n-1]+cache[n-2];
        return cache[n];
    }
}

知识点分析

powered by Gitbook最近更新 2019-05-05

results matching ""

    No results matching ""