爬樓梯問題之二

2021-10-04 05:10:20 字數 841 閱讀 6085

正如前文所說,我們把爬上n個台階共有有多少種方法這一問題通過遞迴的方法得以了解決,但問題雖然解決了可我們想過這個程式的時空複雜度沒有?

首先,時間複雜度。它的時間複雜度是o(2^n),隨著樓梯台階數的增長程式的執行時間呈指數增長。這是一種我們最不想看到的情況。再次,空間複雜度。由於採取函式的巢狀呼叫,程式執行所需空間也是相當大的。最後,那到底有沒有更好的優化方法呢?

答案是肯定的!如果大家把該問題從頂而下的展開來,應該能發現它的所有求解函式f(x),x€展開式是以完全二叉樹的形式組織起來的,且相鄰節點的左右子樹的值相同,這意味著在求解過程中存在重複的內容。

相同顏色的為重複的計算

所以我們可以通過乙個雜湊表儲存每乙個求解函式的值,每當求解乙個f(x)的時候先從雜湊表中檢視有無該函式值,如果有現成的值,則直接返回結果,如果沒有就計算該值並把結果存入雜湊表中。

聽著好複雜哦,那還有沒有更簡單的辦法?答案也是肯定的!!!那就是☞自底向上。那麼何為自底向上?如果仔細觀察,我們會發現,f(3)的值只取決於f(1)和f(2),f(4)的值只取決於f(3)和f(2),...,f(n)的值只取決於f(n-1)和f(n-2)。好了有了這個結論,我們就可以"撿西瓜丟芝麻"了,而不是像雜湊表一樣,儲存所有計算過的f(x),這樣是不是就大大大大減少了程式的空間複雜度?

爬樓梯問題

ok,前段時間在一篇blog上看到乙個關於樓梯的面試題,大概內容如下 現有乙個人,規定他上樓梯時只能一步走乙個台階或者兩個台階。要求 給定任意樓梯的階數,求共有多少種方法爬完樓梯。如果有經驗可以看出,這是一道遞迴的題目。不過這個遞迴 程式怎麼寫呢?我的思路是可以這樣想,不管他前面 怎麼爬,最後總是要...

爬樓梯問題

爬樓梯問題,每次可以走1步或者2步,爬上n層樓梯的總方法,這題就是乙個變相的fibonacci問題。當n 1時,有1種方法,即直接走1步 當n 2時,有2方法 連續走2步,或直接走兩步 對於n,設f n 為總方法,則 f n f n 1 f n 2 ps f n 1 即第一次走一步的走法,f n 2...

爬樓梯問題

蒜頭君自從春節回來以後,體重就像加了特技一樣duang duang 地暴增起來。於是小蒜頭打算每天爬樓梯來燃燒體內的脂肪 咦?蒜怎麼會有脂肪 蒜頭在爬樓梯的時候腦洞大開,因為蒜頭腿短,爬樓梯的時候一次只能邁1級或2級台階,它就想到了,假如一共有n級台階的話,它一共有多少種方法能夠爬到樓梯頂部呢?聰明...