劍指offer--斐波那契數列-跳臺階-變態跳臺階-矩形覆蓋
阿新 • • 發佈:2018-12-20
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。
n<=39
注:
自己最早是直接用一整個數列,將每一步的資料都儲存了下來,但是這是不必要的。因為只需要用到前兩步的資料,所以只需要用兩個變數將前兩步的資料儲存下來即可。
class Solution {
public:
int Fibonacci(int n) {
vector<int> temp={0,1};
if(n<2)
{
return temp[n];
}
int data_N=0;
int data1=0,data2=1;
for(int i=2;i<=n;++i)
{
data_N=data1+data2;
data1=data2;
data2=data_N;
}
return data_N;
}
};
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
class Solution {
public:
int jumpFloor(int number) {
vector<int> temp={0,1,2};
if(number<=2)
{
return temp[number];
}
int data_N=0;
int data1=1,data2=2;
for(int i=3;i<=number;++i)
{
data_N=data1+data2;
data1= data2;
data2=data_N;
}
return data_N;
}
};
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
注:
這裡需要用一個數列將所有的資料儲存下來。每一步的資料等於之前所有步的資料相加。
並且,這裡把
的情況設為1。因為,從平地(第0階),也是一種可能。
class Solution {
public:
int jumpFloorII(int number) {
if(number==0) return 0;
vector<int> temp={1,1};
for(int i=2;i<=number;++i)
{
auto size=temp.size();
int sum=0;
while(size--)
{
sum+=temp[size];
}
temp.push_back(sum);
}
return temp[number];
}
};
題目描述
我們可以用21的小跳臺階橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
class Solution {
public:
int rectCover(int number) {
vector<int> temp={0,1,2};
if(number<=2)
{
return temp[number];
}
int data1=1,data2=2;
int data_N=0;
for(int i=3;i<=number;++i)
{
data_N=data2+data1;
data1=data2;
data2=data_N;
}
return data_N;
}
};