图解LeetCode——873. 最长的斐波那契子序列的长度(难度:中等)

一、题目

如果序列X_1, X_2, ..., X_n满足下列条件,就说它是斐波那契式的:

条件1:n >= 3;
条件2:对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2};

给定一个严格递增的正整数数组形成序列arr,找到arr中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。

回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列

二、示例

示例 1:

输入: arr = [1,2,3,4,5,6,7,8]
输出: 5
解释: 最长的斐波那契式子序列为 [1,2,3,5,8]

示例 2:

输入: arr = [1,3,7,11,12,14,18]
输出: 3
解释: 最长的斐波那契式子序列有 [1,11,12]、[3,11,14] 以及 [7,11,18]

提示:

3 <= arr.length <= 1000
1 <= arr[i] < arr[i + 1] <= 10^9

三、解题思路

如果大家对动态规划比较熟悉,可以采用动态规划进行解题。奈何我这方面实在拉胯,理解不了这么高深的解题方式,所以,就以我自己方便理解的方式进行的解题。不喜见谅,绕行勿喷。

话不多说,言归正传。我的解题思路是这样的,既然想要获取最长的斐波那契序列的长度,那么我们需要找出哪些序列是符合斐波那契数列的。由于是要满足X_i + X_{i+1} = X_{i+2},所以我们需要两个指针来指向X_i和X_{i+1},方便后续对这两个值进行计算

这里有一个重要的条件,就是“给定一个严格递增的正整数数组形成序列arr”,这个数组中的数字是递增的。通过这个条件,我们其实可以确定一点,就是我们不需要从头到尾的去遍历,而只需要去遍历到数组最大元素的1/2处即可,如下所示:

【注意】这里题目中的严格递增,我不知道是不是排除掉了相同元素,例如:1,2,2,2这种。还是所有元素都要满足a[i]一定小于a[i+1],为了不纠结这个情况,所以直接把middle定位到了max的1/2加1的位置上了。

确定了middle的位置之后,其实还有一个需要注意的是,通过计算得出的X_{i+2}是不能大于max这个值的,所以,这也是我们遍历中需要注意判断的一点。

那么下面我们就来演示一下遍历的具体流程,我们先从arr[0]和arr[1]这两个位置开始,具体逻辑如下图所示:

129767f58f6aa11539b3442d95e0d5fa.png

经过第一次遍历后,我们分别赋值了全新的num_a和num_b,那么继续寻找斐波那契子序列,具体逻辑如下图所示:

c1f688d9d927805e2cd0d947cf0c37b0.png

此时我们发现,num_a没有超过middle,并且num_a与num_b相加也没有超过max ,可以继续查找斐波那契子序列,具体逻辑如下图所示:

8d5710ab642309d5c29b9ace78906073.png

此时我们发现,num_a已经等于middle了,不满足小于middle的要求,所以终止寻找斐波那契子序列的操作,如下图所示:

ac59653e62c4c2c650697623964289ac.png

此时result等于3,这就是以arr[0]作为基准的第一次遍历结果。随后,我们继续以arr[1]作为基准,再次按照上面的示例进行循环,如果发现temp值大于result值了,那么则更新result值 。全部更新完毕,一定要记得,如果result不等于0,则返回值是result+2,因为只要匹配到了斐波那契子序列,最短的举例就是3的长度,而我们上面逻辑中,如果找到了斐波那契子序列,result值赋值的是1,所以,最终结果要再加上2。当然,如果没有找到任何的斐波那契子序列,result直接返回0即可,也不需要加2了。

四、代码实现

13a28b937d9e5ad7022518cbec3bbc7c.png

今天的文章内容就这些了,最后一句话:

写作不易,分文不取,陪伴成长,点赞分享。

更多技术文章,欢迎大家关注公众号“爪哇缪斯”(^o^)/~

题目来源:力扣

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值