Leetcode 70.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層的樓梯,你每次只能走一節或者兩節的樓梯,那麼問你一共有多少種走法走完這n節樓梯。

解題思路:

這道題與lintcode中的111題爬樓梯一樣,都屬於斐波那契數列這種問題。對於這類問題而言,我們可以使用遞歸和循環兩種方式,通常遞歸會比較簡潔,並且更容易實現。不過,雖然遞歸有簡潔的優點,但是它同時也有顯著的缺點。遞歸由於是函數調用本身,而函數調用是有時間和空間的消耗的:每一次函數的調用,都需要在內存棧中分配空間以保存參數,返回地址以及臨時變量,而且往棧中壓入和彈出數據都需要時間;另外遞歸中有可能有很多計算都是重複的,從而對性能帶來了很大的負面影響。但是對於遞歸來講,除了效率最嚴重的事情就是有可能發生調用棧溢出。因此,我們選擇循環來解決這個問題。

最終實現:

    public class Solution {
        /**
        * @param n: An integer
        * @return: An integer
        */
        public int climbStairs(int n) {
            // write your code here
            if (n <= 0) {
                return 1;
            }
            if (n == 1) {
                return 1;
            }
            if (n == 2) {
                return 2;
            }
            int firstStep = 1;
            int secondStep = 2;
            int currentStep = 0;
            for (int i = 3; i <= n; ++i) {
                currentStep = firstStep + secondStep;
                firstStep = secondStep;
                secondStep = currentStep;
            }
            return currentStep;
        }
    }

時間複雜度爲O(n),空間複雜度爲O(1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章