爬樓梯問題

2022-02-03 06:32:01 字數 1408 閱讀 6768

1. 爬樓梯問題

問題: (

假設你正在爬樓梯,需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個台階,你有多少種不同的方法可以爬到樓頂呢?

分析:動態規劃,將當前問題分解為包含最優子結構的子問題,使用子問題的最優解來解決當前問題。

假設到第n階的方法有dp[n]種,

那麼從前一階到第n階有兩種方式:

1. 跨1個台階到達第n階

2. 跨2個台階到達第n階

那麼到達第n階的方法應該是兩者之和:dp[n] = dp[n-1] + d[n-2],就是斐波那契數列

實現:

function

climbstairs(n)

return

cur;

}

複雜度分析

時間複雜度:o(n),單迴圈到 n。

空間複雜度:o(1),使用常量級空間。

使用斐波那契數列的計算公式,可以將時間複雜度優化到o(logn);

2. 最小消耗爬樓梯

問題:(

陣列的每個索引做為乙個階梯,第 i個階梯對應著乙個非負數的體力花費值 cost[i](索引從0開始)。

每當你爬上乙個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬乙個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。

示例1輸入: cost = [10, 15, 20]

輸出: 15

解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。

示例2輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]

輸出: 6

解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。

注意:cost 的長度將會在 [2, 1000]。

每乙個 cost[i] 將會是乙個integer型別,範圍為 [0, 999]。

分析:同樣是動態規劃,假設爬到第n階的最小消耗為dp[n],由於上第n階消耗cost[n]

那麼前一階梯的消耗應該是 dp[n-pre] = dp[n] - cost[n]

一次能爬1至2階,n-pre只能是n - 1 或 n - 2,取最小的那個,就是最小消耗

dp[n] = min(dp[n - 1],dp[n - 2]) + cost[n]

實現:

function

minclimbcost(costs)

return

math.min(pre, cur);

}

複雜度分析

時間複雜度:o(n),單迴圈到 n。

空間複雜度:o(1),使用常量級空間。

爬樓梯問題

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級台階的話,它一共有多少種方法能夠爬到樓梯頂部呢?聰明...