题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39
考察点:递归和循环的理解。时间复杂度的分析。以及递归问题的拓展。
思路:单纯用递归的话,虽然简介易懂,但是多了很多重复性的运算,所以运算效率低下。考虑用循环解决,从小到大开始,每次暂存结果,为下一次运算作准备。
class Solution {
public:
int Fibonacci(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
long long int one = 0;
long long int two = 1;
long long int sum = 0;
for (int i = 2; i <= n; i++)
{
sum = one + two;
one = two;
two = sum;
}
return sum;
}
};
拓展题目:
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:还是数组暂存思想,避免递归的深度太大和大量重复计算。
class Solution {
public:
int rectCover(int number) {
vector<int> result(number + 1);
result[0]=0;
result[1]=1;
result[2]=2;//初始化开始情况
for (int i = 3; i <= number; i++)
{
result[i] = result[i - 1] + result[i - 2];//递归方程
}
return result[number];
}
};
本文详细解析了斐波那契数列的高效算法实现,通过循环而非递归的方式提高计算效率,并拓展讨论了利用2*1小矩形覆盖2*n大矩形的方法总数问题,采用数组暂存思想避免重复计算。
1293

被折叠的 条评论
为什么被折叠?



