LeetCode 1027——最长等差数列

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

假设我们以 f[d][nums[i]]表示以 nums[i] 为结尾元素间距为 d 的等差数列的最大长度,那么,如果 nums[i]-d 也存在于 nums 数组中,则有:

f [ d ] [ n u m s [ i ] ] = f [ d ] [ n u m s [ i ] − d ] + 1 f[d][nums[i]]=f[d][nums[i]-d]+1 f[d][nums[i]]=f[d][nums[i]d]+1

否则, f [ d ] [ n u m s [ i ] ] = 1 f[d][nums[i]]=1 f[d][nums[i]]=1

d的取值范围为 [ − ( m a x − m i n ) , + ( m a x − m i n ) ] [-(max-min), +(max-min)] [(maxmin),+(maxmin)]。因为 nums[i]-d 要位于 nums[i] 的前面,所以,针对每一个 d ,我们初始化所有元素为 -1,然后从前往后开始遍历数组,根据上面的公式依次更新 f,其中最大的数值即为所求。

时间复杂度为 O ( d ∗ n u m s . s i z e ( ) ) O(d*nums.size()) O(dnums.size()),空间复杂度为 O ( n u m s . s i z e ( ) ) O(nums.size()) O(nums.size())

3. 代码实现

于是,我开始实现了第一版代码,完全就照着上面的解题思路来写。

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {map<int, map<int, int> > dp;int max_value = 0;int min_value = 500;map<int, int> init_dp;for (size_t i = 0; i < nums.size(); ++i){max_value = max(max_value, nums[i]);min_value = min(min_value, nums[i]);init_dp[nums[i]] = -1;}int diff = max_value - min_value;int ret = 1;for (int d = -diff; d <= diff; ++d) {dp[d] = init_dp;dp[d][nums[0]] = 1;for (size_t i = 1; i < nums.size(); ++i) {if (dp[d].count(nums[i]-d) == 0) {dp[d][nums[i]] = 1;continue;}if (dp[d][nums[i]-d] != -1) {dp[d][nums[i]] = dp[d][nums[i]-d] + 1;ret = max(ret, dp[d][nums[i]]);}else {dp[d][nums[i]] = 1;}}}return ret;}
};

很可惜,没有通过全部测试用例,超时了。

超出时间限制 53 / 65 个通过的测试用例

首先,这里的 dp就是充当哈希表的作用,不需要有序,没有必要用 map,我改成了 unordered_map后,通过了,但是执行用时和消耗内存都排在了末尾。

查看双层 for 循环,针对每一个d,我们其实可以都用同一个哈希表,所以代码作如下修改:

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int max_value = 0;int min_value = 500;unordered_map<int, int> init_dp;for (size_t i = 0; i < nums.size(); ++i){max_value = max(max_value, nums[i]);min_value = min(min_value, nums[i]);init_dp[nums[i]] = -1;}int diff = max_value - min_value;int ret = 1;for (int d = -diff; d <= diff; ++d) {unordered_map<int, int> dp = init_dp; // 这里每次都用同一个即可dp[nums[0]] = 1;for (size_t i = 1; i < nums.size(); ++i) {if (dp.count(nums[i]-d) == 0) {dp[nums[i]] = 1;continue;}if (dp[nums[i]-d] != -1) {dp[nums[i]] = dp[nums[i]-d] + 1;ret = max(ret, dp[nums[i]]);}else {dp[nums[i]] = 1;}}}return ret;}
};

这样,速度和内存都有所提升,但提升得也非常有限。继续思考,题目中给出了 0 <= nums[i] <= 500 的限制条件,所以 n u m s [ i ] − d ∈ [ 0 , 500 ] nums[i]-d\in[0,500] nums[i]d[0,500],如果不在这个范围,肯定是无效的。所以,dp直接就可以用一个大小为 501 的数组来代替了,数组的下标就可以作为索引。

class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int max_value = 0;int min_value = 500;for (size_t i = 0; i < nums.size(); ++i){max_value = max(max_value, nums[i]);min_value = min(min_value, nums[i]);}int diff = max_value - min_value;int ret = 1;for (int d = -diff; d <= diff; ++d) {vector<int> dp(501, -1);dp[nums[0]] = 1;for (size_t i = 1; i < nums.size(); ++i) {if (nums[i]-d < 0 || nums[i]-d > 500) {dp[nums[i]] = 1;continue;}if (dp[nums[i]-d] != -1) {dp[nums[i]] = dp[nums[i]-d] + 1;ret = max(ret, dp[nums[i]]);}else {dp[nums[i]] = 1;}}}return ret;}
};

class Solution:def longestArithSeqLength(self, nums: List[int]) -> int:max_value = max(nums)min_value = min(nums)diff = max_value - min_valueret = 1for d in range(-diff, diff+1):dp = [-1] * 501dp[nums[0]] = 1for i in range(1, len(nums)):if 0 <= nums[i] - d <= 500:dp[nums[i]] = max(dp[nums[i]-d]+1, 1)ret = max(ret, dp[nums[i]])else:dp[nums[i]] = 1return ret

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

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

相关文章

解决vim中NERDTree图标是问号或者乱码问题

解决vim中NERDTree图标是问号或者乱码问题 乱码信息如图解决办法1. 安装字体下载字体安装字体Ubuntu系统Windows11系统 2. 控制台修改字体Ubuntu系统Windows11系统 乱码信息如图 Ubuntu系统上的情况 使用windows控制台连接的情况 解决办法 1. 安装字体 下载字体 在nerd f…

51单片机学习9 串口通讯

51单片机学习9 串口通讯 一、串口通讯简介UARTSTC89C51RC/RD的串口资源 二、51单片机串口介绍1. 内部结构2. 寄存器&#xff08;1&#xff09;串口控制寄存器SCON&#xff08;2&#xff09;电源控制寄存器PCON 3. 计算波特率4. 串口配置步骤 三、 开发示例1. 硬件电路2. 代码实…

网络面试——浏览器输入url到显示主页的过程

浏览器输入URL到显示主页的过程通常可以分为以下步骤&#xff1a; 1. **URL解析**&#xff1a; - 当用户在浏览器的地址栏中输入URL时&#xff0c;浏览器会首先对该URL进行解析。 - 解析URL包括识别协议&#xff08;例如HTTP、HTTPS&#xff09;、主机名&#xff08;例如…

YOLOv5-小知识记录(一)

0. 写在前面 这篇博文主要是为了记录一下yolov5中的小的记忆点&#xff0c;方便自己查看和理解。 1. 完整过程 &#xff08;1&#xff09;Input阶段&#xff0c;图片需要经过数据增强Mosaic&#xff0c;并且初始化一组anchor预设&#xff1b; &#xff08;2&#xff09;特征提…

MSA7T10 DVBT2高清机顶盒方案

一、方案描述 MSA7T10系列芯片是Mstar推出的极富竞争力的DVB-T2机顶盒FTA方案&#xff0c;芯片内置64MB DDR2和T2解调器&#xff0c;支持T2 1.3.1规范&#xff0c;支持HEVC&#xff0c;H.264&#xff0c;MPEG高清视频&#xff0c;支持PVR/Timeshit功能&#xff0c;支持各种多媒…

曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是Reeds-Shepp曲线&#xff1f;2 Reeds-Shepp曲线的运动模式3 Reeds-Shepp曲线算法原理3.1 坐标变换3.2 时间翻转(time-flip)3.3 反射变换(reflect)3.4 后向变换(backwards) 4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f5…

如何利用社媒群组如何高效开发国外客户

现在社媒营销也是越来越流行了&#xff0c;很多外贸人都开始做社媒营销。社媒营销相对来说是比较有温度的一个营销&#xff0c;因为大部分社媒平台都支持在线聊天&#xff0c;触达的即时性是比较高的&#xff0c;效果也比传统的一些方法要好一些。 当然做社媒也是有难度的&…

西藏实景三维技术研讨交流会成功举办

2024年3月21-22日&#xff0c;西藏自治区“实景三维技术研讨交流会”在拉萨成功举办。 本次会议由西藏自治区自然资源厅、自然资源部重庆测绘院指导&#xff0c;西藏自治区测绘学会、西藏自治区地理信息产业协会主办&#xff0c;武汉大势智慧科技有限公司&#xff08;后简称“…

数据库-索引快速学

索引 当表中数据量庞大时&#xff0c;往往搜索一条数据就会耗费很长的时间等待 索引是帮助数据库高效获取数据的数据结构 create index 索引名 on 数据表名&#xff08;字段名&#xff09;;为该表下的某一字段创建索引&#xff0c;检索耗时会大大的减小 索引的优缺点 优点&…

【Python BUG】CondaHTTPError解决记录

问题描述 CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url https://mirrors.ustc.edu.cn/anaconda/pkgs/free/win-64/current_repodata.json Elapsed: 00:26.513315 解决方案 找到用户路径下的 .condarc文件&#xff0c;建议用这个方法前和我一样做个备份&#xff0c;方…

python中类的导入与使用

1、类的介绍 与C中面向对象思想类似&#xff0c;有时候为了方便&#xff0c;需要专门创建一个类&#xff0c;将相关的函数全部写入到该类中&#xff0c;方便后续创建对象&#xff0c;再使用类中函数。那么如何创建完类&#xff0c;在其他文件中使用类中函数&#xff0c;这是这篇…

Python Flask框架 -- flask-migrate迁移ORM模型

# 之前使用的这个db.create_all()很有局限性&#xff0c;它不能把在class里修改的东西同步上数据库&#xff0c;所以不用了 # with app.app_context(): # 请求应用上下文 # db.create_all() # 把所有的表同步到数据库中去 例如&#xff0c;在User类中增加一个email字段&…

STM32和GD32内部时钟与外部时钟讲解

STM32F103为例: 1. 当 HSI 被用作 PLL 时钟输入时,可以实现的最大系统时钟频率为 64 MHz。 2. 要使 USB 功能可用,必须同时启用 HSE 和 PLL,并使 USBCLK 运行在 48 MHz。 3. 要实现 ADC 转换时间为 1 s,APB2 必须为 14 MHz、28 MHz 或 56 MHz。 ①. HSE = 高速外部时钟信号…

[linux初阶][vim-gcc-gdb] OneCharter: vim编辑器

一.vim编辑器基础 目录 一.vim编辑器基础 ①.vim的语法 ②vim的三种模式 ③三种模式的基本切换 ④各个模式下的一些操作 二.配置vim环境 ①手动配置(不推荐) ②自动配置(推荐) vim是vi的升级版,包含了更加丰富的功能. ①.vim的语法 vim [文件名] ②vim的三种模式 命令…

爬取搜狗翻译项目实例

视频中讲解的是百度翻译&#xff0c;但是视频中的方法现在已经不适用了&#xff0c;因为他们对 URL 的参数进行了修改&#xff0c;导致没法直接修改参数来爬取对应的翻译结果&#xff0c;这里我使用搜狗翻译来做演示&#xff0c;原理是一样的。 我们搜索的关键字会返回在 URL 中…

家用超声波清洗机高端品牌推荐!4款值得入手的热门超声波清洗机

急着洗眼镜的朋友先不要慌&#xff0c;虽然洗眼镜是日常生活中最常见的操作&#xff0c;但是在清洗眼镜方面也是有讲究的&#xff0c;不是随随便便把眼镜擦一下就算清洁干净了&#xff01;因为我们拿眼镜布擦眼镜的时候&#xff0c;布料粗糙的微粒就会跟砂纸一样打磨着镜片&…

【python】flask模板渲染引擎Jinja2中的模板继承,简化前端模块化开发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

什么是Prompt Tuning?

本文是观看视频What is Prompt Tuning?后的笔记。 大语言模型&#xff08;如ChatGPT &#xff09;是基础模型&#xff0c;是经过互联网上大量知识训练的大型可重用模型。 他们非常灵活&#xff0c;同样的模型可以分析法律文书或撰写文章。 但是&#xff0c;如果我们需要用其解…

cocos3.0 关于UI组件学习

Sprite 图片&#xff1a;官方文档 Size Mode: 1.Raw&#xff1a;原始大小 2.TRIMMED: 默认&#xff0c;会裁切原始图片透明像素 3.Custom&#xff1a;自定义&#xff0c;只要修改ContentSize&#xff0c;会自动设置 Type 1.Simple:普通,会铺满&#xff0c;一张图。 2.Sliced…

力扣热门算法题 89. 格雷编码,92. 反转链表 II,93. 复原 IP 地址

89. 格雷编码&#xff0c;92. 反转链表 II&#xff0c;93. 复原 IP 地址&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.24 可通过leetcode所有测试用例。 目录 89. 格雷编码 解题思路 完整代码 Python Java 92. 反转链表…