leetcode 70. 爬樓梯
阿新 • • 發佈:2018-12-21
題目描述:
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
思路:
之前看斐波那契數列相關東西時,聽說過這個...所以瞬間想到。第n階臺階,要麼是從n-1階跨一步上來的,要麼是從n-2階跨兩步上來的。所以f(n)=f(n-1)+f(n-2)。但是遞迴時間複雜度太高,要改成迴圈。不如用陣列a[n]儲存所有的中間資料。
int climbStairs(int n) { if(n<3) return n; int a[n]{0}; a[0]=1,a[1]=2; for(int i=2;i<n;i++) a[i]=a[i-1]+a[i-2]; return a[n-1]; }
時間複雜度為O(n),空間複雜度也是O(n)。
注意到a[i]只與a[i-1] 、a[i-2] 相關,空間可以進一步優化。
int climbStairs(int n) {
if(n<3) return n;
int a=1,b=2;
while(n-->2)
{
b=a+b;
a=b-a;
}
return b;
}
時間複雜度為O(n),空間複雜度為O(1)
不過測試執行時間從優化前的0ms增加到了8ms。