【算法】剑指offer-重建二叉树&&斐波那契数列_树叉的根数与斐波那契数列(2)

    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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值