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?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
複製代碼
你正在爬樓梯。到達山頂須要n步。 每次你能夠爬1或2級臺階。你能夠用幾種不一樣的方式爬到山頂? 注意:給定n是一個正整數。 示例1: 輸入:2 輸出:2 說明:爬到山頂有兩種方法。bash
- 1步+ 1步
- 2步 示例2: 輸入:3 輸出:3 說明:爬到山頂有三種方法。
- 1步+ 1步+ 1步
- 1步+ 2步
- 2步+ 1步
本題要求很明確,就是根據目標階梯,預測一下須要多少中1,2組合方式走完整個階梯,粗看貌似很麻煩,用循環來弄不知道有多少狀況,各類if,可是換個角度來看,若是咱們倒着推理,好比最後一級只多是1步上來或者是2步上來,這樣子逆退,就找出來一種遞歸的方式,可是這種方法比較耗時間,沒有經過,不知道對不對,因此換一種方式,咱們試試正向思惟,3級是2步和一步跨上去的,那是否是2+1?一樣4級,也是由兩步和一步跨上去的,也就是n(4)=n(2)+n(3),哎呦,好像斐波那契數列哦。相似的推理,其實咱們能夠猜想出規律n(n)=n(n-1)+n(n-1).因此本題就解決了ui
按照咱們的思路來編輯,代碼以下spa
if (n < 0) {
return 0;
}
if (n <= 2) {
return n;
}
int a = 1;
int b = 2;
int result = 0;
for (int i = 3; i <= n; i++) {
result = a + b;
a = b;
b = result;
}
return result;
複製代碼
時間複雜度: 該方案用了循環m因此f(n)=(n)=n;因此O(f(n))=O(n),即T(n)=O(n)翻譯
空間複雜度: 該方案使用了沒有使用額外空間,因此空間複雜度是O(n)=O(1);code
本題的大體解法如上所訴, 能夠經過逆推來發現特定的規律,直接想多是個很大的問題,因此能夠考慮換個思惟。遞歸