剑指offer 算法 (递归与循环)
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。
題目描述
一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
解析:當n = 1, 只有1中跳法;當n = 2時,有兩種跳法;當n = 3 時,有3種跳法;當n = 4時,有5種跳法;當n = 5時,有8種跳法;.......規律類似于Fibonacci數列
class Solution { public:int jumpFloor(int number) {if(number==1)return 1;if(number==2)return 2;elsereturn jumpFloor(number-1)+jumpFloor(number-2);} };題目描述一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
解析:用Fib(n)表示青蛙跳上n階臺階的跳法數,青蛙一次性跳上n階臺階的跳法數1(n階跳),設定Fib(0) = 1;
當n = 1 時, 只有一種跳法,即1階跳:Fib(1) = 1;
當n = 2 時, 有兩種跳的方式,一階跳和二階跳:Fib(2) = Fib(1) + Fib(0) = 2;
當n = 3 時,有三種跳的方式,第一次跳出一階后,后面還有Fib(3-1)中跳法; 第一次跳出二階后,后面還有Fib(3-2)中跳法;第一次跳出三階后,后面還有Fib(3-3)中跳法
Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
當n = n 時,共有n種跳的方式,第一次跳出一階后,后面還有Fib(n-1)中跳法; 第一次跳出二階后,后面還有Fib(n-2)中跳法..........................第一次跳出n階后, 后面還有 Fib(n-n)中跳法.
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)
又因為Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)
兩式相減得:Fib(n)-Fib(n-1)=Fib(n-1) => Fib(n) = 2*Fib(n-1) (n >= 2)
題目描述
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? class Solution { public:int rectCover(int number) {if(number==1)return 1;if(number==2)return 2;else return rectCover(number-1)+rectCover(number-2);} };
題目描述
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
解析:觀察題目中的矩形,2*n的,是個長條形。既然只是簡單的長條形,那么依然逆向分析。既然是長條形的,那么從后向前,最后一個矩形2*2的,只有兩種情況: 第一種是最后是由一個2*(n-1)的矩形加上一個豎著的2*1的矩形 另一種是由一個2*(n-2)的矩形,加上兩個橫著的2*1的矩形 因此我們可以得出, 第2*n個矩形的覆蓋方法等于第(n-1)個2*1的小矩形加上第(n-2)個2*1的小矩形方法。
class Solution { public:int rectCover(int number) {if(number==0)return 1;else if(number==1)return 1;else if(number==2)return 2;else return rectCover(number-1)+rectCover(number-2);/*unsigned int array[71]={1,1,2};for(int i=3;i<71;i++){array[i]=array[i-1]+array[i-2];}return array[number];*/} };
總結
以上是生活随笔為你收集整理的剑指offer 算法 (递归与循环)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部分真题整理
- 下一篇: 剑指offer 算法(数组 字符串)