算法题解记录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消息)是一种常见的场景应用,特别适合处理某些任务在一段时间后执行的需求,如订单超时处理、…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
