題目描述:
You are climbing a stair case. It takes n steps to reach to the top.Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
題目含義:
共有n層的樓梯,你每次只能走一節或者兩節的樓梯,那麼問你一共有多少種走法走完這n節樓梯。
解題思路:
這道題與lintcode中的111題爬樓梯一樣,都屬於斐波那契數列這種問題。對於這類問題而言,我們可以使用遞歸和循環兩種方式,通常遞歸會比較簡潔,並且更容易實現。不過,雖然遞歸有簡潔的優點,但是它同時也有顯著的缺點。遞歸由於是函數調用本身,而函數調用是有時間和空間的消耗的:每一次函數的調用,都需要在內存棧中分配空間以保存參數,返回地址以及臨時變量,而且往棧中壓入和彈出數據都需要時間;另外遞歸中有可能有很多計算都是重複的,從而對性能帶來了很大的負面影響。但是對於遞歸來講,除了效率最嚴重的事情就是有可能發生調用棧溢出。因此,我們選擇循環來解決這個問題。
最終實現:
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
if (n <= 0) {
return 1;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
int firstStep = 1;
int secondStep = 2;
int currentStep = 0;
for (int i = 3; i <= n; ++i) {
currentStep = firstStep + secondStep;
firstStep = secondStep;
secondStep = currentStep;
}
return currentStep;
}
}
時間複雜度爲O(n),空間複雜度爲O(1)。