劍指offer-跳臺階問題
阿新 • • 發佈:2018-12-13
1. 跳臺階
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
如果第一次跳一個臺階,那麼剩下n-1個臺階,再進行f(n-1)次
如果跳兩個臺階,那麼剩下n-2個臺階,再進行f(n-2)次
這就類似於 Fibonacci,可以用遞迴和迴圈來解決這個問題。
方法一:遞迴
class Solution { public: int jumpFloor(int number) { int count=0; if(number<=0) return 0; else if(number==1) count=1; else if(number==2) count=2; else count=jumpFloor(number-1)+jumpFloor(number-2); return count; } };
方法二:迴圈
class Solution {
public:
int jumpFloor(int number) {
if(number<=0)
return 0;
int n1=0,n2=1,n=0;
for(int i=1;i<=number;i++)
{
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}
};
迴圈要比遞迴更快,所以是推薦用迴圈,也就是下面那個方法。
2.變態跳臺階
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
這個題目可以先列出幾種情況
只有一個臺階的時候,只有一種方法。f(1)=1
有兩個臺階的時候,有兩種方法。f(2)=2 =f(1)+f(0) (假設f(0)=1)
有三個臺階的時候,有4種方法,(先跳一個臺階,先跳兩個臺階,和先跳三個臺階)。 f(3)=4 =f(2)+f(1)+f(0)
有n個臺階的時候,那麼f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(0)
而同時,f(n-1)=f(n-2)+f(n-3)+...+f(0)
因此f(n)也可以化簡為f(n)=2*f(n-1)
由此又可以有遞迴和迴圈兩種方法,依然推薦用迴圈的方法:
class Solution {
public:
int jumpFloorII(int number) {
int n0=1,n1=1;
for(int i=2;i<=number;i++)
{
n1=2*n0;
n0=n1;
}
return n1;
}
};