语言百马百担求马匹数_LeetCode基础算法题第154篇:求第N个Tribonacci数

37283b3b50821351abc673d85be54531.png

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。

如果有任何问题可以在文章后评论或者私信给我。

如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。

持续分享,敬请关注。

LeetCode 1137. 求第N个泰波拿契数(N-th Tribonacci Number)

问题描述:

4baf09a9cb081025f6a5d67ed906ee96.png

注:

  • 0 <= n <= 37;
  • 答案是一个32位整数,即。res <= 2^31 - 1;

示例:

ab0f50bb4d116d90381c7e2e907cc317.png

C语言实现:

泰波拿契数是斐波那契数的扩展。它的求法与求斐波那契数类似,但是要复杂一些。

方法一:递归或者循环

我们依然可以用循环或者递归,像求斐波那契数那样求泰波拿契数。

我这里只说递归方法,因为递归代码要更简洁一些。

一个泰波拿契数是它前面的3个数的和,所以对于前3个数(0,1,1)我们直接赋值,无需计算。

其他的则返回 tribonacci(n-3) + tribonacci(n-2) + tribonacci(n-1)。

但是这里要注意,如果简单的这样处理,那么会有大量的重复计算。当n增大,效率会迅速下降。

为了避免重复计算,对于已经计算过的数,要存起来,下次用的时候直接取。鉴于题目要求n不大于37,所以我们定义一个长度时38的数组T来保存这些数。

方法二:通项公式

在前面我讲,如何求第n个斐波那契数时,我提到了用数列的通项公式一次求出。在这里我们试着求出泰波拿契数的通项公式。

对于一个泰波拿契数数列,我们可以得出如下的关系:

5a71bb915f76db63d707eedfa1494e24.png

可以得到A的特征方程:

f067a1c6752d7d76aa50bf8dfb67738a.png

解这个一元三次方程得到它的3个解, α,β 和 γ :

其种 α 是唯一的实根,是一个无理数。

76b50553aced3d36bd0b49e1485d9f4e.png
33d239ca87ebc2957f4890d0842d9476.png

βγ 是两个共轭复数根。

因此它的比内公式表示为:

60bf26693d70b28479a8e749ca08d5f7.png

(篇幅有限,关于其比内公式的推导,见https://www.mscs.dal.ca/FQ/Scanned/20-2/spickerman.pdf)

第一次看到这个公式很错愕,无理数和复数的和得到一个整实数,多么神奇。

看到这里的朋友一定很好奇算法怎么实现。

其实该比内公式的后两项对结果的影响非常小,只对Tn​的精度有非常小的影响,我们可以简化成:

1c27db0acbed42938a934f7e0d12d49c.png

这个符号表示对结果进行四舍五入。我实际测试的结果: 对n小于57的任意Tn​ 都不受影响。完全满足题目要求

两种算法的代码如下:

f69b5d23805e2690f104662205d94e83.png
d6ba51230d183b88d6199b491592cc8a.png
2b2584215e8d8972dc39e9a00c7d5637.png

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。

代码如下:

6e530eef2cbbfadddb3f1b51081d2d3c.png
8cf78f4c5b2c03258624de950d3914ac.png
e7925e6189a712bca8238868fed8a509.png

Python语言实现:

Python 的实现和C语言的实现一致,不再撰述。

代码如下:

90bcdfca62c66c4c5d5d04f3290b72b7.png
d9527b8ce02e2014965bc6be0fed5a81.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值