算法题解记录32+++最长连续序列(百题筑基)
你们好,我是蚊子码农,好久不见。由于秋招求职的繁琐事情,我有很长一段时间没更新博客,希望我的粉丝们能够谅解。
秋招我拿到了一些offer,最终决定去一个主要做“网络安全”业务的公司工作,也许明天会更好?也许明天会更糟?我不知道,但是未来曲折难行、旅途永无止境,希望我能学到更多知识、做出更多成果物,甚至在这个领域,闯出一点名声吧。
说回原题,我决定把欠下的“百题筑基”(原名百日筑基)做完,这应该是我这段时间最想做的东西了。
另外,在过去3年的学习生涯里,我有一些编程项目,我觉得很有意思,也许会发布在csdn上,当然,我也想开辟一个douyin账号,在里面积累一些粉丝什么的。
不知道有没有公司招收实习生?
我是985工科出生,有丰富的基础知识和实践经验,不妨看看我?
说回主题,下面我讲解一下这道题目吧。
核心概念:开头数【我自创的】
【开头数:一个连续序列的第一个数,比如(1,2)即1是开头数,2不是开头数;(7,8,9,10,11)即7为开头数,其它不是】
一、题目描述
题目难度:中等
1.题目
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
2.示例
示例1:输入:nums = [100,4,200,1,3,2]
输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
3.其它约束
第一,0 <= nums.length <= 10^5第二,-10^9 <= nums[i] <= 10^9
二、解题准备(朴素方案)
本题要求从数组中,拿到一个最长连续序列。
对于无序数组,简单的排序后,就可以很轻松地拿下本题。
需要关注的两个异常是
第一,最长连续序列的头部,不一定从最小的数开始
比如数组【1,2,7,8,9,10,11】
最长序列为【7,8,9,10,11】,答案是5。
如果我们贸然从头计算,那么,就会出错。
解决方案很简单,有两个。
第一,我们可以对有序数组中,每个数进行一次遍历,判断以每个数开头的连续序列的长度。【当然,明显时间复杂度很高】
第二,我们每次遍历前,判断一下这个数是否是开头数【开头数:一个连续序列的第一个数,比如(1,2)即1是开头数,2不是开头数;(7,8,9,10,11)即7为开头数,其它不是】
这样子,能够省去很多时间。
第二,在一个数组中,可能存在同值。
比如数组【1,2,2,2,3,3,3】
这个最长序列的长度其实只有3,但需要格外处理。
假如我们用 if( data【i】 = data【i-1】 + 1 ),就得再加一层
if( data【i】 = data【i-1】)。
此时,才能正确判断。
三、朴素方案的问题
第一,时间复杂度过高
对一个数组进行排序,时间复杂度最快也超过 O(N logN),这就代表着不能满足题意。
第二,代码逻辑比较复杂
虽然编程时,代码逻辑复杂不是大问题(甚至很多复杂问题,必须要复杂逻辑才能解决),当然,就本题来看,我们只需要得到一个最长连续序列的值,却需要2个大系统
第一个,是排序算法。【可以调用函数】
第二个,是计数系统。
在计数系统中,需要从头到尾遍历所有值。
此时,需要
第一,判断数是否序列的开头数。第二,如果是开头数,从头到尾遍历一次。
【在这个遍历中,需要剔除重复数据的影响,比如 1,1,2,3,4,4】
代码逻辑非常复杂,假如是面试手撕算法,大概率没法过关。
这也是我的一点经验,在编程前,最好提前对可能的算法解决方案,进行一次评估,如果编程时间过长,最好还是寻找优化方案,或者干脆另找新思路。
四、解决方案
1.思考
我们知道,原数组排序,时间复杂度太高,不可能解决本题。
那么,不排序,有什么方法解决?
如果每次拿到一个数,然后用这个数,在数组里寻找下一个数,并判断,这是猴子行为,时间复杂度不说,单单判断终止条件,就非常麻烦。
比如【1,3,2,4】,先拿到1,然后在原数组找2,拿到2,找3,拿到3,找4。【每一次,都需要重新判断,时间复杂度应该是O(N!)
有丰富编程经验的我们,立马就知道了O(N)的算法,在原有数据结构的限制下,几乎不可能完成。【排序也不能排,随机读取也读不了】
2.什么数据结构,可以扛起大旗?
我们需要一个结构,插入、读取时间复杂度为O(1),并且最好有序。
但凡,插入时间复杂度是O(LogN),那么插入n个元素,总体时间复杂度已经是O(N logN)了,不满足题意。
明显,就是哈希表。
当然,由于我们想要剔除重复元素,并且key、Value两个域中,有一个域用不到,所以我们选择Java的HashSet。
HashSet,基于哈希表实现,能够完成哈希表的任务。
3.哈希集合无序性
集合是无序的,但是,题目要求的元素之间的关系,赋予了它们相关性。
比如,我们得到一个开头数为1,我们想找到2。
在哈希集合中,直接就能得到。
这就相当于哈希集合已经 有序了
4.算法思路
我们使用朴素方案中,基于排序数组的算法。
此时,由于集合自动去重,所以我们只需要面对一个问题。
第一,最长序列的开头数,不能确定
假如我们先对集合中每个数遍历,然后再次遍历,时间复杂度最差为O(N)
比如集合(1,2,3,4,5)
先对1遍历,1,2,3,4,5
对2遍历,2,3,4,5
对3遍历,3,4,5
对4遍历,4,5
对5遍历,5
可以看到,每个数都可能遍历N次,再加上外层循环【即遍历哈希集合的循环】
总体时间复杂度为O(N * N)
第二,解决方案
对哈希集合遍历,是不可避免的。
但有了数组的思路,我们其实可以知道。
假如一个数不是开头数,我们完全可以跳过。(因为,序列【2,3,4】不可能比【1,2,3,4】更长)
因此,直接跳过即可。
第三,解决方案复杂度O(1)证明
对于开头数,我们只遍历1次,所以其时间复杂度为O(1)
有些人问,对于数组【1,3,5,7,9】
外层循环遍历后,内层也每次都要遍历,时间复杂度怎么会O(1)呢?
外层O(N)遍历后,内层对于开头数,会遍历1次。
也就是说,开头数至多遍历N次。
其他数,只判断后,即结束,仅1次。
所以,内层 * 外层,共O(N)。
五、代码
class Solution {public int longestConsecutive(int[] nums) {int count = 0;// 存储数据Set<Integer> data = new HashSet<>();// 存储for(int i:nums){data.add(i);}// 从i开始,遍历countfor(int i:data){int temp = i-1;int gm = 0;if(!data.contains(temp)){temp++;while(data.contains(temp)){gm++;temp++;}count = Math.max(gm, count);}// 如果存在,那么说明非开始}return count;}
}
六、结语
以上内容即我想分享的关于力扣热题32的一些知识。
我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。
相关文章:
算法题解记录32+++最长连续序列(百题筑基)
你们好,我是蚊子码农,好久不见。由于秋招求职的繁琐事情,我有很长一段时间没更新博客,希望我的粉丝们能够谅解。 秋招我拿到了一些offer,最终决定去一个主要做“网络安全”业务的公司工作,也许明天会更好&a…...
全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家
全国给孩子起名最好的大师颜廷利教授在其最新的哲学探索中,提出了《升命学说》这一前沿理论观点,该理论不仅深刻地回应了古今中外众多哲学流派和思想体系的精髓,还巧妙地融合了实用主义、理想主义以及经验主义的核心理念。通过这一独特的视角…...
Flink Rest API
REST API | Apache Flink Flink官网API 通过curl 或者Rest API工具测试web UI对应的接口返回信息 Flink 提交yarn任务 ./bin/flink run -t yarn-per-job historyServer ../bin/historyserver.sh start...
Zig 语言通用代码生成器:逻辑,冒烟测试版发布二
Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…...
mysql 通过GROUP BY 聚合并且拼接去重另个字段
我的需求: 我想知道同一个手机号出现几次,并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…...
Java应用程序的测试覆盖率之设计与实现(一)-- 总体设计
一、背景 作为测试,如何保证开发人员提交上来的代码都被测试覆盖到,是衡量测试质量的一个重要指标。 本系列文章将要说一说,如何搭建一套测试覆盖率的系统。 包括以下内容: jacoco agent采集执行覆盖率数据jacoco climaven集成jacoco:jacoco-maven-pluginant集成jacoco:…...
Unity C#脚本的热更新
以下内容是根据Unity 2020.1.0f1版本进行编写的 目前游戏开发厂商主流还是使用lua框架来进行热更,如xlua,tolua等,也有的小游戏是直接整包更新,这种小游戏的包体很小,代码是用C#写的;还有的游戏就是通过…...
监督学习之逻辑回归
逻辑回归(Logistic Regression) 逻辑回归是一种用于二分类(binary classification)问题的统计模型。尽管其名称中有“回归”二字,但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…...
深度优先算法(DFS)洛谷P1683-入门
虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章.. 这些代码均是我记录自身成长的记录,有写的不好的地方请谅解! 先上代码: #include <iostream> #include <vector> #include<iomanip> #include<cstdio&…...
Python数据分析基础
本文介绍了Python在数据分析中的应用,包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库,我们可以高效地处理大量数据,并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…...
《企业自设2-软件测试》线下课day3: 006扩展虚拟机
1.win11 修改hosts无权限 分别再cmd终端输入以下两行代码: C:\Windows\System32\drivers\etcnotepad hosts 2.先保存快照!!! 3.关闭虚拟机,将内存,CPU进行修改 就是再这个位置修改: 4.运…...
配置和排查 Lombok 在 IDEA 中使用的详细步骤
在日常开发中,Java 代码常常需要大量的样板代码,比如 getter、setter、toString 等方法。Lombok 是一个 Java 库,可以通过注解的方式,自动生成这些常见的代码,从而让代码更加简洁、清晰。比如,我们可以通过…...
JavaWeb合集18-接口管理Swager
十八、接口管理 1、Swager 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。 官网: https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 <dependency&g…...
背包九讲——二维费用背包问题
目录 二维费用背包问题 问题描述: 解决方法: 方法一: 代码实现: 方法二: 代码实现: 背包问题第五讲——二维费用背包问题 背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中…...
【mysql进阶】4-7. 通用表空间
通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性? ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据,与系统表空间类似也是共享表空间; 服务器运⾏时会把表空间元数…...
2024 年互联网大厂 1300 多道 JAVA 面试题汇总,包含了程序员的所有技术点
作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万,而…...
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...
Linux资源与网络请求
参数说明: d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行c : 切换显示模式,共有两种模式&#…...
RPA技术重塑企业自动化的未来
1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化(Robotic Process Automation,简称RPA)是一种软件技术,通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…...
使用RabbitMQ实现延迟消息的完整指南
在分布式系统中,消息队列通常用于解耦服务,RabbitMQ是一个广泛使用的消息队列服务。延迟消息(也称为延时队列或TTL消息)是一种常见的场景应用,特别适合处理某些任务在一段时间后执行的需求,如订单超时处理、…...
阿里员工:阿里工作7年至少得P7吧,快的都P8了,年薪100W是正常的,80才算及格...
上一篇:一线体面男的收入 年薪64W的阿里蚂蚁员工爆料:在阿里,工作7年至少得P7,快的都P8了,年薪100W才正常,80分才算及格。 其实,在大厂工作,听起来风光无限,但个中滋味&a…...
Django进一步掌握(10月22日)
一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 (1)使用Ht…...
C++从入门到起飞之——红黑树封装map和set 全方位剖析!
目录 1、map和set的整体框架 2、map和set迭代器的实现 3、map支持[] 4、完整源码 set.h map.h RBTree.h 1、map和set的整体框架 因为map和set的底层都是红黑树,所以我们考虑用一个红黑树的类模版去实例化map和set对象!不过,map节点中存…...
【javax maven项目缺少_Maven的依赖管理 引入依赖】
javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…...
手搓一个定时器
目录 1.什么是定时器 2.计时器的使用 3.手搓定时器 3.1定义一个TimerTask类 3.2定义一个Timer类 3.3实现schedule方法 3.4实现Timer的构造方法 3.4.1随时随地查看优先级队列中是否有任务要执行 3.4.2获取队首任务,并判断是否到执行时间 3.4.3到达执行时间…...
AI提示词工程优化Prompt-GPT使用手册(科普一键收藏史上最强攻略)
Prompt(提示),最初是 NLP 研究者为下游任务设计出来的一种任务专属的输入形式或模板。在 ChatGPT 引发大语言模型新时代之后,Prompt 指与大模型交互输入的代称。 随着大模型的进展,Prompt Engineering是一个持久的探索过程。 目录 什么是提示…...
【数据结构】快速排序(三种实现方式)
目录 一、基本思想 二、动图演示(hoare版) 三、思路分析(图文) 四、代码实现(hoare版) 五、易错提醒 六、相遇场景分析 6.1 ❥ 相遇位置一定比key要小的原因 6.2 ❥ 右边为key,左边先走 …...
利用前向勾子获取神经网络中间层的输出并将其进行保存(示例详解)
代码示例: # 激活字典,用于保存每次的中间特征 activation {}# 将 forward_hook 函数定义在 upsample_v2 外部 def forward_hook(name):def hook(module, input, output):activation[name] output.detach()return hookdef upsample_v2(in_channels, o…...
CTF-RE 从0到N: S盒
S盒(Substitution Box) 是密码学中的一种替换表,用于对输入数据进行非线性变换,以增加加密过程的复杂性。它主要用于对称加密算法中(例如AES、DES),作为加密轮次的一部分,对输入字节…...
MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。
2024-10-10,由电信研究所、里斯本大学等联合创建MT-Pref数据集,它包含18种语言方向的18k实例,覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验,我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…...
有中文网站 怎么做英文网站/百度推广话术全流程
1、项目的典型用户与场景 2、对其他组评价 强强联手队项目做得很好,不过如果能够把连网操作就更好了。 滑稽队项目的前台设计挺好,如果把包车的信息都放进数据库就更好了。 梦之翼队的项目做得不错,可以看出他们做得非常的认真,但…...
四川省住房和城乡建设厅网站下载/今日头条新闻
前言 某日需要针对某个输入框做自动补全,但是后来发现输入一个汉字输入几个英文字母的时候也会因为敲入每个英文都会触发事件一次,这种方式非常不好,对服务端的压力太大了,于是这里做一下处理。 截图 解决方案 思路,…...
wordpress分享插件带赞/线上卖货平台有哪些
HDFS DataNode 容错测试情况背景场景描述实现思路预期结果操作步骤把数据上传到 HDFS设置副本数查看数据在 HDFS 情况查看数据磁盘情况将副本同时 kill查看DataNode 进程数据验证总结背景 对于团队提出 HDFS 的数据节点可以宕机多少台, 不会影响数据丢失问题 , 对这个点进行展…...
乐清企业网站建设/谷歌排名查询
往期精选● 架构师高并发高性能分布式教程(4000G)● 39阶段精品云计算大数据实战视频教程● 互联网技术干货视频教程大全【菜单为准】● 2017年8月最新Intellij IDEA全套视频教程● 程序员如何制作高质量的简历【视频简历】● 两套大型电商实战项目 ● 200本经典编程相关…...
北京网站定制设计开发公司/网络广告营销策略
无论服务端或客户端启动时都用到了NioEventLoopGroup,从名字就可以看出来它是NioEventLoop的组合,是Netty多线程的基石。 类结构 NioEventLoopGroup继承自MultithreadEventLoopGroup,多提供了两个方法setIoRatio和rebuildSelectors࿰…...
佛山网页搜索排名提升/seo好seo
1.邮件传输和路由 邮件系统的主要功能是邮件传递,而邮件路由和传输完成了邮件在内部和外部的传递。 Exchange2007的管理员可以配置在组织内仅仅使用中心传输服务器来路由和传输邮件,或者使用中心传输服务器和边缘传输服务器来路由和传输邮件 当仅仅使用中…...