1. 程式人生 > 其它 >LeetCode——動態規劃

LeetCode——動態規劃

70. 爬樓梯

假設你正在爬樓梯。需要 n階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
在這裡插入圖片描述
思路:

  • 一道經典的動態規劃題目,由於每次可以爬一個或者兩個臺階,因此可以將問題轉化為最後一步是爬一階還是爬兩階的問題。
  • 狀態轉移方程為:f(n)=f(n-1)+f(n-2)
  • 如果利用遞迴來求解的話會產生過多的重複計算,時間空間複雜度都很高,所以要從小到大地進行迭代求解,計算每一步的臨時變數。
  • 我最初的演算法是將每個中間變數都用陣列存起來,然後挨個計算到f(n),但是這樣的空間複雜度太高了,不過能自己做出來還是不錯啦~
class Solution {
public:
    int
climbStairs(int n) { //動態規劃 //狀態方程f(n)=f(n-1)+f(n-2) //先計算儲存f(1)~f(n-1)的值到一個數組 vector<int>nums(n+1,0); nums[1]=1; if(n>1) nums[2]=2; //迭代賦值 for(int i=3;i<=n;i++) { nums[i]=nums[i-1]+nums[i-2]; } return
nums[n]; } };
  • 官方題解給的方法就很好,利用滾動陣列,只用三個變數來儲存每一步的結果,很好,又學到一招
class Solution {
public:
    int climbStairs(int n) {
        //動態規劃
        //狀態方程f(n)=f(n-1)+f(n-2)
        //p為f(n-2),q為f(n-1),r為f(n)
        //f(0)=1,f(1)=1
        int p=0,q=0,r=1;
        for(int i=0;i<n;i++)
        {
            p=q;
            q=
r; r=p+q; } return r; } };