假設你正在爬樓梯.須要n階你才能到達.app
每次你能夠爬1或者2個臺階.你有多少種不一樣的方法能夠爬到樓頂呢?spa
注意: 給定n是一個正整數.code
示例1:blog
輸入: 2 輸出: 2 解釋: 有兩種方法能夠爬到樓頂。 1. 1 階 + 1 階 2. 2 階
示例2:class
輸入: 3 輸出: 3 解釋: 有三種方法能夠爬到樓頂。 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階
解法一: 動態規劃cli
先不講思想之類的,先看n值不斷變化的時候,有什麼規律嗎?,用result記錄多種可能性方法
經過上面咱們發現規律以下:im
思想margin
下面咱們談思想,不難發現,這個問題能夠被分解爲一些包含最優子結構的子問題,即它的最優解能夠從其子問題的最優解來有效的構建,能夠用動態規劃來解決這一問題.img
第 i 階能夠由如下兩種方法獲得:
因此到達第 i 階的方法總數就是第 (i - 1) 和第 (i - 2)階的方法數之和.
令dp[ i ] 表示能到達第 i 階的方法總數:
dp[ i ] = dp[i - 1] + dp[i - 2]
代碼
func climbStairs(_ n: Int) -> Int { guard n > 0 else {return 0} if n == 1 { return 1 } var dp: [Int] = [Int]() dp.append(0) //第一個元素,當n = 0,不存在方式爬到樓上 dp.append(1) //第2個元素,當n = 1, 1種方式 dp.append(2) //第3個元素,當n = 2, 2種方式 for i in 3..<n + 1 { dp.append(dp[i - 1] + dp[i - 2]) //用append不如用=賦值 } return dp[n] }
結果
上面就是動態規劃的思想作,之後有其餘思想作此題目,會更新最新的思想和代碼(因本階段專一動態規劃解法).