
2026-03-04:最长斐波那契子数组。用go语言,给定一个只包含正整数的数组 nums。把数组中任意一段连续元素看作一个片段;如果该片段从第 3 个元素起,每一项都等于前面两项之和,则称其为斐波那契型片段。长度为 1 或 2 的片段默认满足这个条件。请找出 nums 中满足该性质的最长连续片段,并返回它的长度。
3 <= nums.length <= 100000。
1 <= nums[i] <= 1000000000。
输入: nums = [1,1,1,1,2,3,5,1]。
输出: 5。
解释:
最长的斐波那契子数组是 nums[2..6] = [1, 1, 2, 3, 5]。
[1, 1, 2, 3, 5] 是斐波那契的,因为 1 + 1 = 2, 1 + 2 = 3, 且 2 + 3 = 5。
题目来自力扣3708。
你希望我基于给定的Go语言代码,详细拆解它解决“最长斐波那契子数组”问题的核心思路和执行过程,并分析该解法的时间复杂度与空间复杂度。
我们以输入 nums = [1,1,1,1,2,3,5,1] 为例,逐步拆解代码的执行逻辑:
n = 8(数组有8个元素)。ans = 2:因为题目规定长度为1或2的片段默认满足条件,所以最长长度的初始值设为2(最小有效长度)。start = 0:start 是当前斐波那契型片段的起始下标,用于标记当前有效片段的起点。循环从 i = 2 开始(因为需要验证第3个元素是否满足“前两项之和”的规则),直到 i < n:
i值 | nums[i] | nums[i-1]+nums[i-2] | 比较结果 | 执行逻辑 | ans值 | start值 | 说明(当前有效片段) |
|---|---|---|---|---|---|---|---|
2 | 1 | 1+1=2 | 不相等 | 1. ans = max(2, 2-0)=2;2. start = 2-1=1 | 2 | 1 | 原片段[0,1]无效,新起点设为1 |
3 | 1 | 1+1=2 | 不相等 | 1. ans = max(2, 3-1)=2;2. start = 3-1=2 | 2 | 2 | 原片段[1,2]无效,新起点设为2 |
4 | 2 | 1+1=2 | 相等 | 无操作 | 2 | 2 | 片段[2,3,4]有效,继续 |
5 | 3 | 1+2=3 | 相等 | 无操作 | 2 | 2 | 片段[2,3,4,5]有效,继续 |
6 | 5 | 2+3=5 | 相等 | 无操作 | 2 | 2 | 片段[2,3,4,5,6]有效,继续 |
7 | 1 | 3+5=8 | 不相等 | 1. ans = max(2, 7-2)=5;2. start = 7-1=6 | 5 | 6 | 原片段[2,6]有效(长度5),更新ans;新起点设为6 |
循环结束后,需要检查最后一段从 start 到数组末尾的片段是否为有效片段:
执行 return max(ans, n-start),即 max(5, 8-6)=max(5,2)=5,最终返回结果5。
nums[i] != nums[i-1]+nums[i-2] 时:说明当前位置 i 不满足规则,因此以 start 为起点到 i-1 的片段 是当前最长的有效斐波那契片段,需要计算其长度(i-start)并更新 ans;同时将 start 重置为 i-1(因为 i-1 和 i 可能是新片段的前两个元素,符合默认有效规则)。nums[i] == nums[i-1]+nums[i-2] 时:说明当前片段仍满足规则,无需更新 ans 和 start,继续向后验证。i=2 到 i=n-1,共执行 n-2 次,每次循环内的操作(比较、取最大值、赋值)都是 O(1) 的常数时间。max 操作也是 O(1)。n 是数组长度),满足题目中 n <= 100000 的性能要求。n、ans、start、i),没有创建额外的数组、哈希表等数据结构,所有变量占用的空间与输入数组长度无关。start 标记当前有效片段起点,遍历验证每个位置是否满足斐波那契规则,不满足时更新最长长度并重置起点,最终得到最长有效片段长度。O(n),额外空间复杂度 O(1)。.
package main
import (
"fmt"
)
func longestSubarray(nums []int)int {
n := len(nums)
ans := 2
start := 0
for i := 2; i < n; i++ {
if nums[i] != nums[i-1]+nums[i-2] {
ans = max(ans, i-start) // [start,i-1] 是斐波那契子数组
start = i - 1
}
}
return max(ans, n-start) // [start,n-1] 是斐波那契子数组
}
func main() {
nums := []int{1, 1, 1, 1, 2, 3, 5, 1}
result := longestSubarray(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def longest_subarray(nums):
n = len(nums)
ans = 2
start = 0
for i in range(2, n):
if nums[i] != nums[i-1] + nums[i-2]:
ans = max(ans, i - start) # [start,i-1] 是斐波那契子数组
start = i - 1
return max(ans, n - start) # [start,n-1] 是斐波那契子数组
def main():
nums = [1, 1, 1, 1, 2, 3, 5, 1]
result = longest_subarray(nums)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <algorithm>
int longestSubarray(std::vector<int>& nums) {
int n = nums.size();
int ans = 2;
int start = 0;
for (int i = 2; i < n; i++) {
if (nums[i] != nums[i-1] + nums[i-2]) {
ans = std::max(ans, i - start); // [start,i-1] 是斐波那契子数组
start = i - 1;
}
}
return std::max(ans, n - start); // [start,n-1] 是斐波那契子数组
}
int main() {
std::vector<int> nums = {1, 1, 1, 1, 2, 3, 5, 1};
int result = longestSubarray(nums);
std::cout << result << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·