LeetCode——動態規劃
阿新 • • 發佈:2021-03-22
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;
}
};