1. 程式人生 > >劍指offer-跳臺階問題

劍指offer-跳臺階問題

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;
    }
};