[70] Climbing Stairs

1. 題目描述

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級臺階有多少種方案。

2. 解題思路

題目是一個動態規劃問題。動態規劃主要是找到從大問題化解爲多個小問題的方案,通過解決這些小問題並進行組合得到大問題的結果。從大到小進行分析,發現如果要到達臺階n,可以從臺階n-1到達,也可以從臺階n-2到達,那麼只需要得到到達臺階n-1有多少種方案和到達臺階n-2有多少種方案,二者相加即可得到到達臺階n有多少種方案。遞推公式如下:
climb(m) = 0, m < 0
climb(0) = 1
climb(1) = 1
climb(n) = climb(n-1)+climb(n-2), n >= 2
得到了遞推公式,就可以用遞歸的方式求解問題。動態規劃一般情況下有一個可優化的點,即在遞歸的基礎上增加一個保存中間結果的緩存,將中間結果緩存下來。比如本題中,當n=5時,我們需要計算climb(4)和climb(3),但當計算climb(4)時又需要計算climb(3)和climb(2),可以看到上述過程中將climb(3)重複計算了兩次,增加了遞歸次數和時間上的開銷,於是我們可以用一個緩存,當第一次計算climb(3)時將其結果記錄下來,之後再計算時,查看是否已經計算過,如果計算過直接將該值返回即可,避免了重複的計算。

3. Code

public class Solution {

    public int climbStairs(int n) {
        // 初始化一個數組保存中間結果
        int [] ways = new int[n];
        // 開始遞歸
        return climb(n, ways);
    }

    public int climb(int n, int[] ways)
    {
        if(n < 0)
        {
            return 0;
        }
        else if(n == 0 || n == 1)
        {
            return 1;
        }
        // 如果當前臺階數的方法數目沒被計算過
        if(ways[n-1] == 0){
            // 當前臺階數的方案數量爲向下走兩級臺階和向下走一級臺階的方案數量之和
            ways[n-1] = climb(n-1, ways) + climb(n-2, ways);
        }
        return ways[n-1];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章