版權聲明:本文為博主原創文章,未經博主允許不得轉載。
難度:容易
要求:
假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?
樣例 :
比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法
返回 3
思路:
爬樓梯可以用到斐波那契數列F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)所以我們程序中需要用到遞歸函數。記住如果樓梯的階數是N,這上樓梯的方法總數為f(N+1)。
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int n) {
// write your code here
if(n = 0){
return 1;
}
if (n == 1 || n == 2) {
return n;
}
int n1 = 1;
int n2 = 2;
for (int i = 3; i <= n; i++) {
int tmp = n2;
n2 = n1 + n2;
n1 = tmp;
}
return n2;
}
}
如果此題可擴展為一次可以跨m級臺階,則共有多少種方法?
public class Solution {
/**
* @param n: An integer
* @return: An integer
*/
public int climbStairs(int ladder) {
// write your code here
return calculateCount(ladder,2);
}
public int calculateCount(int ladder, int maxJump) {
int jump = 0;
if (ladder == 0) {
return 1;
}
if (ladder >= maxJump) {
// 剩下的樓梯大于最大可跳躍數
for (int i = 1; i <= maxJump; i++) {
jump += calculateCount(ladder - i, maxJump);
}
} else {
// 剩下的樓梯不足最大可跳躍數
jump = calculateCount(ladder, ladder);
}
return jump;
}
}