LeetCode 1027——最长等差数列

news/2024/4/28 21:59:37/文章来源:https://blog.csdn.net/seniusen/article/details/136994394

阅读目录

    • 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.luyixian.cn/news_show_1026925.aspx

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

相关文章

GPT-5有望在今年夏季到来

当OpenAI一年前发布了GPT-4 AI模型时&#xff0c;整个行业都被这个能模仿人类交流和写作的技术所震撼&#xff0c;同时也引发了一阵巨大的炒作和恐慌。自那以后&#xff0c;AI界许多人都关心的问题是&#xff1a;GPT-5什么时候出来&#xff1f;在全球各地的采访和媒体露面中&am…

开源大数据集群部署(十七)HADOOP集群配置(二)

作者&#xff1a;櫰木 1 HADOOP集群配置 配置文件workers [roothd1.dtstack.com software]# cd /opt/hadoop/etc/hadoop [roothd1.dtstack.com hadoop]# pwd /opt/hadoop/etc/hadoop [roothd1.dtstack.com hadoop]# cat >> workers <<EOF hd3.dtstack.com hd1.d…

【每日一题】1997. 访问完所有房间的第一天-2024.3.28

题目&#xff1a; 1997. 访问完所有房间的第一天 你需要访问 n 个房间&#xff0c;房间从 0 到 n - 1 编号。同时&#xff0c;每一天都有一个日期编号&#xff0c;从 0 开始&#xff0c;依天数递增。你每天都会访问一个房间。 最开始的第 0 天&#xff0c;你访问 0 号房间。…

基于51单片机的汽车安全带检测控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1To_ZEiJHBrZnm9ejYHFoPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

为响应国家号召,搜维尔科技开启虚拟仿真实验室设备升级改造服务

近日&#xff0c;国务院发布了关于《推动大规模设备更新和消费品以旧换新行动方案》&#xff0c;该通知的发布表现出国家对于科技创新事业的高度重视。各行各业都在积极响应国家号召&#xff0c;加快数字化转型和设备升级与更新步伐。搜维尔科技为响应国家号召&#xff0c;将开…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读&#xff1a; 不要安装iOS-Tagent &#xff0c;安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本&#xff0c;安装完…

Mysql的日志管理,备份与回复

目录 一、Mysql日志管理 1、日志的默认位置及配置文件 2、日志分类 2.1错误日志 2.2通用查询日志 2.3二进制日志 2.4慢查询日志 2.5中继日志 3、日志配置 4、日志查询 4.1查询通用日志是否开启 4.2查询二进制日志是否开启 4.3查看慢查询日志是否开启 4.4查询慢查…

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

UE4_旋转节点总结一

一、Roll、Pitch、Yaw Roll 围绕X轴旋转 飞机的翻滚角 Pitch 围绕Y轴旋转 飞机的俯仰角 Yaw 围绕Z轴旋转 飞机的航向角 二、Get Forward Vector理解 测试&#xff1a; 运行&#xff1a; 三、Get Actor Rotation理解 运行效果&#xff1a; 拆分旋转体测试一&a…

春秋云境CVE-2022-24663

简介 远程代码执行漏洞&#xff0c;任何订阅者都可以利用该漏洞发送带有“短代码”参数设置为 PHP Everywhere 的请求&#xff0c;并在站点上执行任意 PHP 代码。P.S. 存在常见用户名低权限用户弱口令 正文 进入首页我们没看到任何有价值的东西&#xff0c;那么就只好去寻找…

Gartner 公布 2024 年八大网络安全预测

近日&#xff0c;Gartner 安全与风险管理峰会在悉尼举行&#xff0c;旨在探讨网络安全的发展前景。 本次峰会&#xff0c;Gartner 公布了 2024 年及以后的八大网络安全预测。 Gartner 研究总监 Deepti Gopal 表示&#xff0c;随着 GenAI 的不断发展&#xff0c;一些长期困扰网…

SQLite数据库文件损坏的可能几种情况(一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 概述 SQLite数据库具有很强的抗损坏能力。如果应用程序崩溃&#xff0c…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

It takes two (搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 AAAO AAAA AAAA 输出 NO 思路&#xff1a; 根据题目意思&#xff0c;如果存在的 A 联通不可以成为 矩形&#xff0c;输出 NO&#xff0c;否则输出 YES 这道题看数据范…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

Linux文件系统和日志管理

文件系统的组成 Linux 文件系统会为每个文件分配两个数据结构&#xff1a;索引节点&#xff08;index node&#xff09; 和 目录项&#xff08;directory entry&#xff09;&#xff0c;它们主要用来记录文件的元信息和目录层次结构。 索引节点&#xff0c;也就是 inode&#…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

第三十二天-PythonWeb主流框架-Django框架

目录 1.介绍 发展历史 介绍 2.使用 1.安装 2.创建项目 3.项目结构 4.启动 3.开发流程 1.设置ip可访问 2.创建模块 3.第一个页面 4.视图 5.include()参数 6.url与视图的关系 7.响应内容 4.视图处理业务逻辑 1.响应html 2.获取url参数 3.从文件响应html内容 …

7.shell for循环

shell 循环 for循环案例1:案例2&#xff1a;案例3:案例4:案例5:案例6&#xff1a;案例7:案例8&#xff1a;案例9:案例10:案例11: for循环 什么是循环 重复执行一段代码 比如批量创建100个用户&#xff0c;可以用到循环。 循环的目的是为了简化代码&#xff0c;提高代码的重复利…