【刷题日记】最长定差子序列

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。

子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。

这道题,看了一眼,劈里啪啦一分钟写完,自信写完,时间超限,天杀的我就知道我不可能一分钟做出mid题!!

/*** @param {number[]} arr* @param {number} difference* @return {number}*/
var longestSubsequence = function(arr, difference) {const n=arr.length;const dp=new Array(n+1).fill(1);let res=0;for(var i=0;i<n;i++){for(var j=0;j<i;j++){if(arr[i]-arr[j]==difference){dp[i]=Math.max(dp[i],dp[j]+1);}}if(res<dp[i])res=dp[i];}return res;
};

没关系,我们来理思路,这至少说明前面几道题我能做到看见即秒了。

其实我们思路基本上是对的,但是得利用一点巧思。

 看官方给的思路。

因为我们每次都在左侧找一个最近的等于arr【i】-d元素并取其对应dp值。

因此我们直接用dp【v】表示以v为结尾的最长的等差子序列的长度 

官方题解使用了动态规划的方法来解决这个问题,并且为了优化空间复杂度,采用了哈希表(在 JavaScript 中是

官方题解使用了动态规划的方法来解决这个问题,并且为了优化空间复杂度,采用了哈希表(在 JavaScript 中是 Map 对象)来存储中间结果。这种方法的关键是理解状态转移方程和如何利用哈希表来高效地实现这个方程。

在这个问题中,状态转移方程是 `dp[v] = dp[v-d] + 1`,意味着如果存在一个值为 `v-d` 的元素,那么以值为 `v` 的元素结尾的最长等差子序列的长度可以从以 `v-d` 结尾的最长等差子序列的长度推导出来,即在后者基础上加一。

解题步骤

1. 初始化:创建一个 Map 对象 `dp` 来存储每个值作为等差子序列末尾时的最长长度。同时,初始化一个变量 `ans` 来记录遍历过程中找到的最长等差子序列的长度。

2. 遍历数组:遍历给定数组 `arr` 中的每个元素 `v`。

3. 更新 DP 表:对于当前元素 `v`,查找 `dp` 中 `v-difference`(即 `v-d`)的值。如果找到了,说明存在一个等差子序列以 `v-d` 结尾,那么以 `v` 结尾的最长等差子序列的长度就是以 `v-d` 结尾的最长等差子序列的长度加一。如果没有找到,说明以 `v` 为结尾的等差子序列只包含 `v` 本身,其长度为1(这里通过 `(dp.get(v - difference) || 0) + 1` 实现,如果 `dp.get(v - difference)` 返回 `undefined`,则用 `0` 替代)。

为了更好理解 也可以替换成

if(dp.get(v - difference) ==undefined){dp.set(v,1)
}else{dp.set(v,dp.get(v - difference)+1)
}

4. 更新最大长度:每次更新 `dp[v]` 后,用 `dp.get(v)` 更新 `ans`,确保 `ans` 始终是遍历到目前为止找到的最长等差子序列的长度。

5. 返回结果:遍历结束后,`ans` 存储的就是整个数组的最长等差子序列的长度。

var longestSubsequence = function(arr, difference) {let ans = 0;const dp = new Map();for (const v of arr) {dp.set(v, (dp.get(v - difference) || 0) + 1);ans = Math.max(ans, dp.get(v));}return ans;
};

这段代码实现了上述逻辑:

- 使用 `for (const v of arr)` 遍历数组。
- 对每个元素 `v`,通过 `dp.set(v, (dp.get(v - difference) || 0) + 1);` 更新哈希表,这里 `dp.get(v - difference) || 0` 是获取以 `v-difference` 结尾的最长等差子序列的长度,如果不存在则返回0,然后加1表示将当前元素 `v` 加入到等差子序列中。
- 使用 `ans = Math.max(ans, dp.get(v));` 更新找到的最长等差子序列的长度。
- 最终返回 `ans` 作为结果。

如果想把过程写的更加清晰一点就:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战杯 python+深度学习+opencv实现植物识别算法系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的植物识别算法研究与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 更多…

ElastAlert 错误日志告警

文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件&#xff0c;…

JavaWeb后端——控制反转IOC/依赖注入DI

控制反转&#xff1a;why&#xff0c;目标是要做到控制反转 依赖注入&#xff1a;how&#xff0c;如何实现控制反转&#xff0c;控制反转有很多方法&#xff0c;依赖注入是其中一种方法 控制反转&#xff08;Inversion of Control, IoC&#xff09;和依赖注入&#xff08;Depe…

JavaEE企业级应用软件开发—Spring框架入门学习笔记(一)

一、认识框架 实际开发中&#xff0c;随着业务的发展&#xff0c;软件系统变得越来越复杂&#xff0c;如果所有的软件都从底层功能开始开发&#xff0c;那将是一个漫长而繁琐的过程。此外&#xff0c;团队协作开发时&#xff0c;由于没有统一的调用规范&#xff0c;系统会出现大…

Java+SpringBoot:构建稳定高效的计算机基础教学平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

ORM模型类

模型 创建两个表 创建模型类 from django.db import models# Create your models here. class BookInfo(models.Model):name models.CharField(max_length10, uniqueTrue) # 书名pub_date models.DateField(nullTrue) # 发布时间read_count models.IntegerField(default…

【力扣 51】N 皇后(回溯+剪枝+深度优先搜索)

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…

【自然语言处理-工具篇】spaCy<1>--介绍及安装指南

目录 前言 安装指南 pip conda spaCy升级 总结 前言 spaCy是一个开源的自然语言处理库,用于处理和分析文本数据。它提供了许多功能,包括分词、词性标注

三网码支付系统源码,三网免挂有PC软件,有云端源码,附带系统搭建教程

搭建教程 1.先上传云端源码 然后配置Core/Config.php文件里面数据库信息注改&#xff1b;数据库帐号密码 2.云端源码里面Core/Api_Class/Instant_Url_List.php文件配置终端地址注改&#xff1b;第4 http://终端地址/ 3.导入云端数据库 账号admin 密码123456注改&#xff1…

Mysql进阶(事务)

一、数据库事务 数据库事务是访问并可能操作数据项的一个数据库操作序列&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作完成。 通俗的来讲&#xff0c;就是一次对数据库操作过程&#xff0c;这个过程由多条sql执行&#xff0c;这么…

二叉树的锯齿形遍历,力扣

目录 题目&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 解题方法&#xff1a; 相似题目对比分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 补充说明&#xff1a; 思路优化&#xff1a; 代码实现(层序遍历倒序)&#xff1a; 题…

MySQL进阶45讲【12】为什么你的MySQL偶尔会卡一下

1 前言 平时的工作中&#xff0c;不知道大家有没有遇到过这样的场景&#xff0c;一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持…