爬樓梯與斐波那契數列


今天做leetcode時,做到了爬樓梯問題:

https://leetcode.com/problems/climbing-stairs/

問題不再贅述。

  剛開始看到題的時候,就想着分析n級樓梯,直接得出答案。但是,在分析的過程中發現,若是對於一個常數n,且n不太大的情況下,利用排列組合的方法,也許可以得出結果,但是工作量大得無法想象,遂放棄排列組合。

  於是,老辦法,n=1,n=2,n=3...發現竟然有點像斐波那契數列,於是,按照斐波那契數列的方法去做,果然ok!

  雖然得到了結果,但是偏執癌又犯了,為什么可以用斐波那契數列解決呢?思索之后,未得出滿意的結果,遂查找資料:

  斐波那契數列,兔子生產與斐波那契數列,爬樓梯與斐波那契數列。。。

  (期間推敲了兔子生產的問題)

 

  在這個博客里 http://blog.csdn.net/ljsspace/article/details/6455293 給出了讓人滿意的分析:

  首先考慮第一步的走法:第一步可以走1級台階,也可以走2級台階。那么,設S(n)表示走n級台階的走法數量,如果第一步走1級台階,剩下的台階數為n-1,也就是說這種情況下的走法是相當於S(n-1);同理,如果第一步走2級台階,剩下的台階數為n-2,這樣的走法相當於S(n-2);於是,得出遞推公式:

S(n) = S(n-1) + S(n-2);

  接下來就很簡單了:

S(1)=1,S(2)=2;

  這下感覺圓滿了!!

  

  不過,還是應當反思一下,為什么自己沒有想到這樣去分析呢?其實最初開始分析的時候,也是朝着這個方向去的,但是,思考一陣之后,沒有得出滿意答案,於是就放棄了。其實,這是一直都存在的毛病,確切說,應該是見得少的緣故,導致沒有足夠的經驗,權衡之后,選擇放棄,因為有可能是白白浪費時間和精力。事實證明,放棄的決定大多數是錯誤的:首先,對問題的“第一印象”是很重要的,往往就是從“第一印象”着手去分析,因為對於一個陌生的問題,也只能這樣做;其次,隨着分析的深入,從“第一印象”擴展開來,都會大致朝着正確的方向的,並逐漸接近問題的本質,那句話怎么說來着?透過現象看本質,現象是事物本質的外部表現,等等(理論學得不好),大概就是說通過現象去認識本質(詞窮了);再次,在除去將要被“放棄”的方向之外,沒有其他可以努力的方向時,就更不應該放棄了。

 

  還有一個問題:

  在實現過程中,使用兩種方法:

  由於水平有限,“第一印象”只能想到這兩種。

  方法一:

class Solution {
public:
    int climbStairs(int n) {
        
        if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else{
            int n1 = 1, n2 = 2;
            int nf;
            for(int i = 2;i < n;++i){
                nf = n1 + n2;
                n1 = n2;
                n2 = nf;
            }
            return nf;
        }
    }
};

方法二:

class Solution {
public:
    int climbStairs(int n) {
        
        if(n == 1){
            return 1;
        }else if(n == 2){
            return 2;
        }else{
            vector<int> buff;
            buff.push_back(1);
            buff.push_back(2);
            for(int i = 2;i < n;++i){
                int temp = buff[i - 1] + buff[i - 2];
                buff.push_back(temp);
            }
            return buff[n-1];
        }

    }
};

  兩種方法提交之后,方法二的Runtimes比方法一的要少,這說明使用法二性能比法一要好,就涉及到vector相關性能分析了,稍后再補上。

  如果有哪位能夠給出一些指導,將不勝感激!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM