跳臺階
題目描述:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階共有多少種跳法(先後次序不同算不同的結果)。
思路1:窮舉然後找規律。設跳上一個N級臺階共有M種跳法。
N |
M |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
5 |
5 |
8 |
6 |
13 |
發現其實就是斐波那契數列。
思路2:小青蛙跳臺階時,可以有兩種方案,一是再跳一級階梯到達第 i 級階梯,此時小青蛙處於第 i-1 級階梯;而是再跳兩級階梯到達第 i 級階梯,此時小青蛙處於第 i-2 級階梯。小青蛙跳n層的有f(n)種跳法,跳到n-1層時是分f(n-1)種跳法,跳到n-2層時是f(n-2)種跳法,所以f(n)=f(n-1)+f(n-2)。
方案1:使用遞歸寫斐波那契數列。
class Solution {
public:
int jumpFloor(int number) {
if(number == 0) return 0;
if (number == 1) return 1;
if(number == 2) return 2;
return jumpFloor(number-1)+ jumpFloor(number-2);
}
};
運行時間:658ms
佔用內存:504K
方案2:使用循環代替遞歸。
class Solution {
public:
int jumpFloor(int number) {
int num1 = 1;
int num2 = 1;
int target = number;
int result = 0;
if(target <= 1){
return target;
}
for(int i=1;i<target;i++){
result = num1 + num2;
num1 = num2;
num2 = result;
}
return result;
}
};
運行時間:3ms
佔用內存:604K
方案3://該方案目前結果不正確,還在修改中。
class Solution {
public:
int get_c(int low,int high){
int s = 1;
int d = 1;
int count_tmp = high;
int count=0;
while(count < count_tmp){
s = s * low;
d = d * high;
low--;
high--;
count++;
}
return s/d;
}
int jumpFloor(int number) {
int dec = number / 2;
int i = 0;
int result = 0;
int low = number;
int high = 0;
while(i <= dec){
result = result + get_c(low--,high++);
i++;
}
return result;
}
};
參考鏈接:
https://blog.csdn.net/weixin_38118016/article/details/79068755
https://blog.csdn.net/lskcgh/article/details/80201822
https://blog.csdn.net/qq_34624951/article/details/80099745
變態跳臺階
題目描述:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階…它也可以跳上n級,求該青蛙跳上一個n級的臺階總共有多少種跳法。
思路1:窮舉法找規律。設跳上N級臺階共有M種跳法。
N |
M |
1 |
1 |
2 |
2 |
3 |
4 |
4 |
8 |
5 |
16 |
其實跳上N級臺階共有跳法
1 + 2^0 + 2^1 + …+ 2^(N-2)種,即M = 2^(N-1)。
方案1:
#include <math.h>
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0) return 0;
if(number == 1) return 1;
int result = 1;
for(int i=0;i<number - 1;i++){
result += pow(2,i);
}
return result;
}
};
運行時間:4ms
佔用內存:596K
方案2:
#include <math.h>
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0) return 0;
if(number == 1) return 1;
return pow(2,number-1);
}
};
運行時間:4ms
佔用內存:460K
思路2:假設再跳一級階梯到達第 i 級階梯,此時小青蛙處於第 i-1 級階梯;再跳兩級階梯到達第 i 級階梯,此時小青蛙處於第 i-2 級階梯…再跳i級階梯到達第i級階梯,此時小青蛙處於第0級階梯;小青蛙跳n層的有f(n)種跳法,跳到n-1層時是f(n-1)種跳法,跳到n-2層時是f(n-2)種跳法…跳到0層時是f(0)種跳法,所以f(n)=f(n-1)+f(n-2) +…+f(0); f(n-1)=f(n-2)+f(n-3) +…+f(0) ,該兩式相減可得f(n) = 2*f(n-1)。
方案3:
#include <math.h>
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0) return 0;
if(number == 1) return 1;
if(number == 2) return 2;
return 2*jumpFloorII(number-1);
}
};
運行時間:4ms
佔用內存:484K
參考鏈接:
https://blog.csdn.net/qq_23217629/article/details/51723722