《剑指 Offer》专项突破版 - 面试题 93 : 最长斐波那契数列(C++ 实现)

news2024/9/20 16:30:34

题目链接:最长斐波那契数列

题目

输入一个没有重复数字的单调递增的数组,数组中至少有 3 个数字,请问数组中最长的斐波那契数列的长度是多少?例如,如果输入的数组是 [1, 2, 3, 4, 5, 6, 7, 8],由于其中最长的斐波那契数列是 1、2、3、5、8,因此输出 5。

分析

所谓斐波那契数列,是指数列中从第三个数字开始每个数字都等于前面两个数字之和,如数列 1、2、3、5、8、13 就是一个斐波那契数列。

可以从左至右每次从输入的数组中取出一个数字,使之和前面的若干数字组成斐波那契数列。一个数字可能和前面不同的数字组成不同的斐波那契数列。例如,输入数组 [1, 2, 3, 4, 5, 6, 7, 8],假设我们处理到数字 6,数字 6 就可以和前面的数字组成两个斐波那契数列,分别是 1、5、6 和 2、4、6。也就是说,每处理到一个数字时可能面临若干选择,需要从这些选择中找出最长的斐波那契数列。解决一个问题需要多个步骤,每一步面临若干选择,这个题目看起来适合运用回溯法。但由于这个问题没有要求列出所有的斐波那契数列,而是找出最长斐波那契数列的长度,也就是求最优解,因此可以用动态规划来解决这个问题。

分析确定状态转移方程

应用动态规划的关键在于找出状态转移方程。将数组记为 A,A[i] 表示数组中下标为 i 的数字。对于每个 j(0 <= j < i),A[j] 都有可能是在某个斐波那契数列中 A[i] 前面的一个数字。如果存在一个 k(0 <= k < j)满足 A[k] + A[j] = A[i],那么这 3 个数字就组成了一个斐波那契数列。这个以 A[i] 为结尾、前一个数字是 A[j] 的斐波那契数列是在以 A[j] 为结尾、前一个数字是 A[k] 的序列的基础上增加一个数字 A[i],因此前者的长度是在后者的长度的基础上加 1

例如,在数组 A = [1, 2, 3, 4, 5, 6, 7, 8] 中,A[7] 等于 8。数字 8 既可以在 1、2、3、5(结尾数字为 A[4])的基础上形成更长的斐波那契数列,也可以和数字 6(A[5])一起形成斐波那契数列 2、6、8,还可以和数字 7(A[6])一起组成斐波那契数列 1、7、8。虽然序列 2、6 和 1、7 本身都不是斐波那契数列,但在后面添加数字 8 之后就变成斐波那契数列

由于以 A[i] 为结尾的斐波那契数列的长度依赖于它前面的数字 A[j],不同的 A[j] 能和 A[i] 形成不同的斐波那契数列,它们的长度也可能不同。因此,状态转移方程有两个参数 i 和 j,f(i, j) 表示以 A[i] 为最后一个数字、A[j] 为倒数第 2 个数字的斐波那契数列的长度。如果数组中存在一个数字 k,使 A[i] = A[j] + A[k](0 <= k < j < i),那么 f(i, j) = f(j, k) + 1,即在以 A[j] 为最后一个数字、A[k] 为倒数第 2 个数字的斐波那契数列的基础上增加一个数字 A[i],形成更长的一个数列。f(i, j) 的值可能是 2,此时虽然 A[i] 和 A[j] 这两个数字现在还不能形成一个有效的斐波那契数列,但可能会在之后增加一个新的数字使之形成长度为 3 甚至更长的斐波那契数列

根据状态转移方程写代码

由于状态转移方程有两个参数 i 和 j,因此需要一个二维数组来缓存 f(i, j) 的计算结果。i 对应二维数组的行号,j 对应二维数组的列号。由于 i 大于 j,因此实际上只用到了二维数组的左下角部分。如果数组的长度是 n,那么 i 的取值范围为 1 ~ n - 1,而 j 的取值范围为 0 ~ n - 2

下表记录了计算数组 [1, 2, 3, 4, 5, 6, 7, 8] 中最长斐波那契数列的长度的过程。

代码实现

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {
        unordered_map<int, int> numToIndex;
        numToIndex[arr[0]] = 0;
​
        int n = arr.size();
        vector<vector<int>> dp(n, vector<int>(n - 1));
        int result = 0;
        for (int i = 1; i < n; ++i)
        {
            for (int j = 0; j < i; ++j)
            {
                int target = arr[i] - arr[j];
                if (numToIndex.count(target) && numToIndex[target] < j)
                {
                    int k = numToIndex[target];
                    dp[i][j] = dp[j][k] + 1;
                    result = max(result, dp[i][j]);
                }
                else
                {
                    dp[i][j] = 2;
                }
            }
            numToIndex[arr[i]] = i;
        }
        return result;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1546558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录训练营Day33:● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

1005.K次取反后最大化的数组和 题目链接 https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/ 题目描述 思路 1、自己的想法 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {sorted(nums);//遇到 <0 的 &#xff0c;就…

CTF题型 nodejs(1) 命令执行绕过典型例题

CTF题型 nodejs(1) 命令执行绕过 文章目录 CTF题型 nodejs(1) 命令执行绕过一.nodejs中的命令执行二.nodejs中的命令绕过1.编码绕过2.拼接绕过3.模板字符串4.Obejct.keys5.反射6.过滤中括号的情况典型例题1.[GFCTF 2021]ez_calc2.[西湖论剑 2022]Node Magical Login 一.nodejs中…

黑马头条day5总结

1、surefire-reports for the individual test results. 借鉴&#xff1a;【已解决】surefire-reports for the individual test results.-CSDN博客 Please refer to D:\javashizhan01\heima-leadnews\heima-leadnews-service\heima-leadnews-article\target\surefire-report…

手撕算法-数组中的第K个最大元素

描述 分析 使用小根堆&#xff0c;堆元素控制在k个&#xff0c;遍历数组构建堆&#xff0c;最后堆顶就是第K个最大的元素。 代码 class Solution {public int findKthLargest(int[] nums, int k) {// 小根堆PriorityQueue<Integer> queue new PriorityQueue<>…

k8s入门到实战(六)—— ConfigMap介绍

ConfigMap configmap 是 k8s 中的资源对象&#xff0c;用于保存非机密性的配置的&#xff0c;数据可以用 kv 键值对的形式保存&#xff0c;也可通过文件的形式保存。 什么是 configmap 在 k8s 中&#xff0c;ConfigMap 是一种用于存储应用程序配置数据的对象。它允许将配置信…

【python】Jupyter Notebook 修改默认路径

文章目录 一、修改前&#xff08;一&#xff09;问题&#xff08;二&#xff09;修改前的默认路径 二、修改配置文件、更改路径&#xff08;一&#xff09;找到配置文件并打开&#xff08;二&#xff09;创建目标文件夹、得到新的路径&#xff08;三&#xff09;修改配置文件 三…

小目标检测篇 | YOLOv8改进之GSConv + Slim Neck提升小目标检测效果

前言:Hello大家好,我是小哥谈。在文章中,作者提出了一种新方法GSConv来减轻模型的复杂度并保持准确性。GSConv可以更好地平衡模型的准确性和速度。并且,提供了一种设计范式Slim Neck,以实现检测器更高的计算成本效益。实验过程中,与原始网络相比,改进方法获得了最优秀的…

nginx--解决响应头带Set-Cookie导致的验证失败

解决响应头带Set-Cookie导致的验证失败 前言给nginx.conf 设置Secure配置完成后会发现cookie就不会发生变化了 前言 在用nginx做代理的时候&#xff0c;会发现nginx在访问不同ip请求的时候会带setCookie 导致后端就是放开cookie验证&#xff0c;在访问玩这个链接他更新了cooki…

成都爱尔胡建斌院长强调黄斑病变是眼睛哪儿出了问题

黄斑位于眼球内部的眼底的视网膜区域&#xff0c;处于人眼的光学中心区&#xff0c;是视力轴线的投影点。它是人眼视网膜中央视觉细胞最集中的部位。黄斑中心多为锥形细胞&#xff0c;对明暗不敏感&#xff0c;对色敏感。黄斑外围多为柱形细胞&#xff0c;对明暗敏感,对色几乎不…

javaWeb私人牙科诊所管理系统

一、摘要 随着科技的飞速发展&#xff0c;计算机已经广泛的应用于各个领域之中。在医学领域中&#xff0c;计算机主要应用于两个方面&#xff1a;一是医疗设备智能化&#xff0c;以硬件为主。另一种是病例信息管理系统&#xff08;HIS&#xff09;以软件建设为主&#xff0c;以…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

【数据结构与算法】用染色法判定二分图

问题描述 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行&#xff0c;每行包含两个整数 u 和 v&#xff0c;表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图…

js中如何用点击地图获取经纬度

要实现在地图上点击并获取被点击地址的经纬度&#xff0c;然后渲染至页面中的功能&#xff0c;你需要首先确保你使用的地图API支持点击事件&#xff0c;并且能够返回点击位置的经纬度。以高德地图&#xff08;AMap&#xff09;为例&#xff0c;你可以按照以下步骤实现这个功能&…

wma怎么转换成mp3?无损转换!

WMA&#xff08;Windows Media Audio&#xff09;文件格式诞生于微软公司的数字音频技术研发。由于其高压缩性能和较好的音质&#xff0c;在推出初期主要用于Windows Media Player等微软产品。然而&#xff0c;随着MP3格式的盛行&#xff0c;WMA的使用范围逐渐受到限制。 MP3文…

ES6 基础

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

3.学习前后端关联

目录 1.接口类型 2.错误状态码 3.如何定义路由 4.那如何要求前端传入一个JSON数据呢&#xff1f; 4.解决前后端口不同源,跨域问题 1.使用CrossOrigin 2.直接复制代码使用 5.用户登录校验 1.接口类型 POST(新增数据)、PUT(更新更改数据)、GET(查询)、DELET(删除数据) …

Vivado ECO Flow

Vivado ECO流量 重要&#xff01;ECOs只在设计检查点上工作。ECO布局仅在设计后可用检查点已在Vivado IDE中打开。 工程变更单&#xff08;ECOs&#xff09;是对实施后网表的修改意图在对原始设计影响最小的情况下实施更改。Vivado提供ECO流&#xff0c;允许您修改设计检查点、…

Xshell连接虚拟机非常慢

问题&#xff1a; 打开虚拟机连接时发现过了几分钟依然卡着在&#xff0c;但是主机可以ping通虚拟机&#xff0c;虚拟机也可以ping通主机感觉很奇怪&#xff0c;查询后得知需要修改ssh设置 打开配置 vim /etc/ssh/sshd_config 修改配置 找到 UseDNS&#xff0c;去掉前面的#号…

大学宠物医疗试题及答案,分享几个实用搜题和学习工具 #学习方法#笔记#知识分享

大学开学&#xff0c;就意味着又回到了被线性代数、大学物理等测验题折磨的状态了……网站无法手动输入题干公式&#xff0c;初高中用过的搜题软件又都搜不到&#xff0c;想找个答案解析仿佛在大海捞针&#xff01;不过不用怕&#xff0c;今天小林就把从大学攒到毕业工作都在使…