7、题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
n<=39
时间限制:1秒 空间限制:32768K
这么简单的题我竟然想了很久方法还不对。。以下是答案的两种
Ⅰ 递归调用法
方法简单但是效率不高,运行时间970ms。
代码:
class Solution {
public:
int Fibonacci(int n) {
if(n <= 0)
return 0;
if(n==1 || n==2)
return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
};
Ⅱ 动态规划法
思想:每次返回的f,即数列的第n个值都等于它的后一个数减去它的前一个数,用g来记录当前值的后一个值。
如下图:
class Solution {
public:
int Fibonacci(int n) {
int f = 0,g = 1;
while(n-->0){
g += f;
f = g - f;
}
return f;
}
};
8、题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
时间限制:1秒 空间限制:32768K
思想:和上一题类似,跳上每一节台阶的跳法次数,等于它的上一节和上上节的次数之和,因为每一节都是从它的上一节跳一节到达或者它的上上节跳两节到达的。
但是运行时间要650ms。
代码:
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);
}
};
9、变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
时间限制:1秒 空间限制:32768K
思路:还是递归调用的思想
class Solution {
public:
int jumpFloorII(int number) {
int res = 1;//=1的情况是直接跳上当前台阶的跳法
if(number<=0)
return 0;
if(number==1)
return res;
for(int i = 2;i <= number;i++){
res += jumpFloorII(i-1);
}
return res;
}
};