if(pre.empty() || vin.empty())
{
return nullptr;
}
//闭区间所以:起始位置:0 最后一个位置: \*\*.size()-1
return reConstructBinaryTreeCore(pre,0,pre.size()-1,vin,0,vin.size()-1);
}
};
---
##
### 斐波那契数列
![image-20220407211023116](https://img-blog.csdnimg.cn/img_convert/b96161c09fc0bcb72f2c2f5c8e397d85.png)
##### 方法1:递归
class Solution {
public:
int Fibonacci(int n) {
if(n == 1 || n== 2)
{
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
};
##### 方法2:迭代
class Solution {
public:
int Fibonacci(int n) {
int f1 = 1,f2=1,f3;
//斐波那契数列是 1 1 2 3 5 8 13 21 …
//前两项是不需要计算的,所以循环条件为n-2>0
//从第三个项开始计算,否则不用计算
while(n>2)
{
f3 = f1+f2;
f1 = f2;
f2 =f3;
n–;
}
return f2;
}
};
//也可以写成:
class Solution {
public:
int Fibonacci(int n) {
//题目已经说了:n>=1
if(n == 1 || n== 2)
{
return 1;
}
int f1 = 1,f2 =1,f3;
//从第三个项开始计算
//计算第n个斐波那契数
for(int i =3;i<=n;i++)
{
//迭代
f3 = f1+f2;
f1 = f2;
f2 = f3;
}
return f2;
}
};
##### 方法3:剪枝
直接用最简单的递归因为代码空间复杂度过高,过不了OJ,所以我们可以采用map进行“剪枝”
![image-20220416153845321](https://img-blog.csdnimg.cn/img_convert/7103da3538d7f710002a4f0aa37b4baa.png)
所以我们可以采用一种剪枝的手法,用map来记录已经计算过的数字, 我们遇到一个数时,先在map中查找这个数是否被计算过,如果没有被计算过,就计算,然后放到map中,如果已经计算过,直接拿出来使用
* map<第几个斐波那契数,值是几>
class Solution {
public:
unordered_map<int, int> filter;//<第几个斐波那契数,值是几>
int Fibonacci(int n) {
if(n == 1 || n== 2)
{
return 1;
}
int ppre = 0;//记录第n-2个斐波那契数
if(filter.find(n-2) == filter.end())
{
//没有第n-2个斐波那契数的值
ppre = Fibonacci(n-2);
filter.insert({n-2,ppre});//把第n-2个斐波那契数插入进去
}
else
{
//有这个数,直接使用
ppre = filter[n-2];
}
int pre = 0;//记录第n-1个斐波那契数
if(filter.find(n-1) == filter.end())
{
//没有第n-1个斐波那契数的值
pre = Fibonacci(n-1);
filter.insert({n-1,pre});//把第n-1个斐波那契数插入进去
}
else
{
//有这个数,直接使用
pre = filter[n-1];
}
return ppre + pre;
}
};
这里先计算第n-2个斐波那契数放前面,如果先计算第n-1个斐波那契数,就会导致一些重复计算
![img](https://img-blog.csdnimg.cn/img_convert/bbeb7a9e3af8b088caf235bb4f8aa0bb.png)
![img](https://img-blog.csdnimg.cn/img_convert/5c5878806509fe6d86f9dc60454d4e82.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**