当前位置: 首页 > news >正文

算法题解记录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+++最长连续序列(百题筑基)

你们好&#xff0c;我是蚊子码农&#xff0c;好久不见。由于秋招求职的繁琐事情&#xff0c;我有很长一段时间没更新博客&#xff0c;希望我的粉丝们能够谅解。 秋招我拿到了一些offer&#xff0c;最终决定去一个主要做“网络安全”业务的公司工作&#xff0c;也许明天会更好&a…...

全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家

全国给孩子起名最好的大师颜廷利教授在其最新的哲学探索中&#xff0c;提出了《升命学说》这一前沿理论观点&#xff0c;该理论不仅深刻地回应了古今中外众多哲学流派和思想体系的精髓&#xff0c;还巧妙地融合了实用主义、理想主义以及经验主义的核心理念。通过这一独特的视角…...

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 语言通用代码生成器&#xff1a;逻辑&#xff0c;冒烟测试版发布二 Zig 语言是一种新的系统编程语言&#xff0c;其生态位类同与 C&#xff0c;是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust&#xff0c;尤其是在开发过程中无穷无尽抛错的过程&#x…...

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求&#xff1a; 我想知道同一个手机号出现几次&#xff0c;并且手机号出现在哪些地方。下面是要的效果。 源数据: 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框架来进行热更&#xff0c;如xlua&#xff0c;tolua等&#xff0c;也有的小游戏是直接整包更新&#xff0c;这种小游戏的包体很小&#xff0c;代码是用C#写的&#xff1b;还有的游戏就是通过…...

监督学习之逻辑回归

逻辑回归&#xff08;Logistic Regression&#xff09; 逻辑回归是一种用于二分类&#xff08;binary classification&#xff09;问题的统计模型。尽管其名称中有“回归”二字&#xff0c;但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…...

深度优先算法(DFS)洛谷P1683-入门

虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章.. 这些代码均是我记录自身成长的记录,有写的不好的地方请谅解&#xff01; 先上代码&#xff1a; #include <iostream> #include <vector> #include<iomanip> #include<cstdio&…...

Python数据分析基础

本文介绍了Python在数据分析中的应用&#xff0c;包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库&#xff0c;我们可以高效地处理大量数据&#xff0c;并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…...

《企业自设2-软件测试》线下课day3: 006扩展虚拟机

1.win11 修改hosts无权限 分别再cmd终端输入以下两行代码&#xff1a; C:\Windows\System32\drivers\etcnotepad hosts 2.先保存快照&#xff01;&#xff01;&#xff01; 3.关闭虚拟机&#xff0c;将内存&#xff0c;CPU进行修改 就是再这个位置修改&#xff1a; 4.运…...

配置和排查 Lombok 在 IDEA 中使用的详细步骤

在日常开发中&#xff0c;Java 代码常常需要大量的样板代码&#xff0c;比如 getter、setter、toString 等方法。Lombok 是一个 Java 库&#xff0c;可以通过注解的方式&#xff0c;自动生成这些常见的代码&#xff0c;从而让代码更加简洁、清晰。比如&#xff0c;我们可以通过…...

JavaWeb合集18-接口管理Swager

十八、接口管理 1、Swager 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 官网: https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 <dependency&g…...

背包九讲——二维费用背包问题

目录 二维费用背包问题 问题描述&#xff1a; 解决方法&#xff1a; 方法一&#xff1a; 代码实现&#xff1a; 方法二&#xff1a; 代码实现&#xff1a; 背包问题第五讲——二维费用背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定容量的背包中…...

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性&#xff1f; ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据&#xff0c;与系统表空间类似也是共享表空间&#xff1b; 服务器运⾏时会把表空间元数…...

2024 年互联网大厂 1300 多道 JAVA 面试题汇总,包含了程序员的所有技术点

作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#xff0c;而…...

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

Linux资源与网络请求

参数说明&#xff1a; d : 改变显示的更新速度&#xff0c;或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度&#xff0c;如果使用者是有 superuser 的权限&#xff0c;则 top 将会以最高的优先序执行c : 切换显示模式&#xff0c;共有两种模式&#…...

RPA技术重塑企业自动化的未来

1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种软件技术&#xff0c;通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…...

使用RabbitMQ实现延迟消息的完整指南

在分布式系统中&#xff0c;消息队列通常用于解耦服务&#xff0c;RabbitMQ是一个广泛使用的消息队列服务。延迟消息&#xff08;也称为延时队列或TTL消息&#xff09;是一种常见的场景应用&#xff0c;特别适合处理某些任务在一段时间后执行的需求&#xff0c;如订单超时处理、…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...