【算法练习】动态规划:哈希表保存状态(一)
前言本文将简单介绍一下力扣中的几道动态规划习题这些题目可以引入哈希表来保存先前的状态也是一个较好的解题思路解决动态规划类型题目的核心思想就是把先前的重复的子问题的结果存储在后续的的推导中可以直接获取无需重复计算。保存结果可以使用一个数组dp[ ]也可以使用hash表下面就通过几道力扣中的题来初步认识一下该解题思路一最长定差子序列题目链接https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/解题思路题意不难理解寻找最长的等差序列即可这个序列不要求连续给定了一个差值difference。如果按照以前的做题经验我们直接创建一个dp[ ]是否可以解决问题我们假定dp[i] 表示为以i位置为结尾的所有等差子序列中最长的等差子序列长度dp[i] 的值依赖于先前状态的推导但是dp[]的前驱只保存长度不能判断当前元素nums[i]是否能和前面的子数组构成等差序列这样就无法充分利用dp[ ]数组。虽然可以固定 i 使得 j 从前往后遍历到 i 位置来寻找符合等差的子序列但是时间复杂度为On* 2级别 效率太低会超时所以本题采用哈希表是更好的选择哈希表可以达到dp数组同样的效果。我们让hash中存储 元素 长度。一个等差序列的核心是差值和一个元素差值diff方法中已提供所以我们只要能推导出整个等差序列即可推导方法很简单固定 i 位置的元素向前寻找是否存在符合 nums[i] - nums[j] diff ,即是否存在等于nums[i] - diff的元素即可。所以下面就可以分为三种情况1找不到那让 i 后移即可说不定他在后面2找得到那么直接让对应位置的长度值加一即可和dp[i] dp[ j] 1一样。由于题目要求求最长的等差数组长度所以子啊维护hash的过程中还要一边更新变量ret代码参考publicintlongestSubsequence(int[]arr,intdifference){MapInteger,IntegerhashnewHashMap();intret1;for(inta:arr){hash.put(a,hash.getOrDefault(a-difference,0)1);//a - b d,在hash表中寻找是否存在bretMath.max(ret,hash.get(a));//维护最大长度}returnret;}通过上述的方法可以看到以On的时间复杂度进行一次遍历就能得到结果不过此题给定了定长d所以只需要已知一个元素就能推导等差序列后面还有变种题二最长的斐波那契子序列长度题目链接https://leetcode.cn/problems/length-of-longest-fibonacci-subsequence/description/解题思路从推导等差数列变为推导斐波那契数列原理相同。假设三个数ab c 构成斐波那契数列则满足a b c 所以要想对斐波那契进行推到需要已知两个数bc才能推出前一个。则 a c - b于是此题目就可以转变为 固定 后两个数查找前面是否存在 元素 a 能构成斐波那契数列即可。固定两个数所以需要创建一个二维dp [i] [j]并且 i j。dp[i][j] 表示 : 以ij位置为末尾的所有子序列中最长的等差序列长度。也就是在题目一中来个双重for循环即可所以问题变为向前寻找a即可寻找的情况如下1 找不到那只需让c 后移即可b继续从[ 0 …i-1]位置进行遍历增大寻找范围2能找到但是a的下标k 有问题假如i k j ,则a就加载bc两数中间值符合位置错误所以不符合3能找到k i j ,此时合法更新dp[i][j] dp[k][i] 1。dp[i][k]是前一个以ab结尾的斐波那契数列长度状态转移这一点需要理清找符合的元素a如何找还需要判断其存在的位置k是否合理不妨我们引入hash存储nums[ ]中的所有元素及其下标映射需要时直接查表即可注意细节1,初始化问题dp[ ][ ]中存储斐波那契数列长度要注意初始化为2便于第一次找到符合的斐波那契数列时正确的长度更新代码参考publicintlenLongestFibSubseq(int[]nums){intnnums.length;int[][]dpnewint[n][n];MapInteger,IntegerhashnewHashMap();for(inti0;in;i){hash.put(nums[i],i);}//初始化把i j的位置初始化也可以全部初始化不过其他位置用不到for(intj0;jn;j){for(inti0;ij;i){dp[i][j]2;}}intmaxLen0;//顺序k i j,a b cfor(intj2;jn;j){for(inti1;ij;i){intanums[j]-nums[i];if(hash.containsKey(a)){//能找到//判断下标kintkhash.get(a);if(kikj)continue;//位置不合法elseif(ki){dp[i][j]dp[k][i]1;//状态转移maxLenMath.max(maxLen,dp[i][j]);}}}}returnmaxLen3?maxLen:0;//不合法返回0}该解法的固定顺序是先固定c,使得b移动去寻找a也可以固定b移动c,寻找a.视情况而定大体逻辑都是利用过去的状态去推导当前的状态而已本文结束如有纰漏还请及时指出~~

相关新闻

基于Java+SSM+Django超市管理系统(源码+LW+调试文档+讲解等)/超市管理软件/超市管理系统功能/超市管理系统优势/超市管理系统价格/超市收银系统/超市库存管理系统/超市货架管理系统

基于Java+SSM+Django超市管理系统(源码+LW+调试文档+讲解等)/超市管理软件/超市管理系统功能/超市管理系统优势/超市管理系统价格/超市收银系统/超市库存管理系统/超市货架管理系统

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

2026/7/3 8:03:06 阅读更多 →
SpringBoot+Vue 智能家居销量数据分析_jrabo平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

SpringBoot+Vue 智能家居销量数据分析_jrabo平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着物联网技术的快速发展和智能家居设备的普及,智能家居市场呈现出爆发式增长的趋势。消费者对智能家居产品的需求日益多样化,从智能照明、安防监控到环境监测等,覆盖了家庭生活的方方面面。然而,面对激烈的市场竞争&#x…

2026/7/5 14:44:05 阅读更多 →
SpringBoot+Vue 心脏病数据分析系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

SpringBoot+Vue 心脏病数据分析系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 心血管疾病是全球范围内致死率最高的慢性疾病之一,其早期诊断和数据分析对患者的治疗与康复至关重要。传统的医疗数据管理方式效率低下,难以实现数据的实时分析与共享,导致医疗资源的浪费和诊疗效率的降低。基于此,开发一款高…

2026/7/5 23:31:54 阅读更多 →

最新新闻

Git+GitHub新手实操手册:5步闭环搞定日常开发

Git+GitHub新手实操手册:5步闭环搞定日常开发

1. 这不是“又一个Git教程”——它是一份能让你三天后还在用的实操手册 你点开这个标题,大概率正卡在某个具体场景里:刚被同事甩来一个仓库链接,却连怎么把代码下载到自己电脑上都搞不清;或者写了半天功能,想提交却发现…

2026/7/6 20:43:49 阅读更多 →
CodeRed CMS未来路线图:即将推出的功能与改进指南 [特殊字符]

CodeRed CMS未来路线图:即将推出的功能与改进指南 [特殊字符]

CodeRed CMS未来路线图:即将推出的功能与改进指南 🚀 【免费下载链接】coderedcms Wagtail CodeRed Extensions enabling rapid development of marketing-focused websites. 项目地址: https://gitcode.com/gh_mirrors/co/coderedcms CodeRed C…

2026/7/6 20:41:48 阅读更多 →
OpenCV 4.9 与 Ultralytics YOLO 集成:Python 实现 5 行代码实时视频目标检测

OpenCV 4.9 与 Ultralytics YOLO 集成:Python 实现 5 行代码实时视频目标检测

OpenCV 4.9 与 Ultralytics YOLO 集成实战:5行代码构建实时视频分析系统1. 环境准备与工具链配置在开始构建实时视频分析系统之前,我们需要确保开发环境配置正确。以下是推荐的开发环境配置:Python环境要求:Python 3.8或更高版本&…

2026/7/6 20:41:48 阅读更多 →
如何利用deepTools与Python集成实现测序数据的自动化批量处理

如何利用deepTools与Python集成实现测序数据的自动化批量处理

如何利用deepTools与Python集成实现测序数据的自动化批量处理 【免费下载链接】deepTools Tools to process and analyze deep sequencing data. 项目地址: https://gitcode.com/gh_mirrors/de/deepTools 在高通量测序数据分析领域,高效处理海量数据是研究人…

2026/7/6 20:41:48 阅读更多 →
终极OnionOS使用指南:为Miyoo Mini/Mini+打造完美复古游戏体验

终极OnionOS使用指南:为Miyoo Mini/Mini+打造完美复古游戏体验

终极OnionOS使用指南:为Miyoo Mini/Mini打造完美复古游戏体验 【免费下载链接】Onion OS overhaul for Miyoo Mini and Mini 项目地址: https://gitcode.com/gh_mirrors/on/Onion OnionOS是一款专为Miyoo Mini和Mini掌机设计的增强型操作系统,通过…

2026/7/6 20:33:46 阅读更多 →
SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊

SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊

SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊 【免费下载链接】SRN-Deblur Repository for Scale-recurrent Network for Deep Image Deblurring 项目地址: https://gitcode.com/gh_mirrors/sr/SRN-Deblur SRN-Deblur是一个基于Sc…

2026/7/6 20:31:46 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻