LC 128.最长连续序列

128.最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 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

提示:

  • 0 ≤ n u m s . l e n g t h ≤ 1 0 5 0 \leq nums.length \leq 10^5 0nums.length105
  • − 10 9 ≤ n u m s [ i ] ≤ 1 0 9 {-10}^9 \leq nums[i] \leq 10^9 109nums[i]109

解法一(排序)

思路分析:

  1. 题目要求:找出数字连续的最长序列,且不需要在原数组中连续,则可以尝试对原数组进行排序;
  2. 排序之后,在遍历数组,判断 相邻元素是否连续, 若连续则计数长度+1, 若不连续则将计数长度归1,重新开始计数;
  3. 因为序列长度,需要算上第一个元素,即 只有一个元素时, 序列长度为1, 所以初始序列长度为 1;
  4. 同时需要注意: 题目并未说明数组中的元素不重复, 所以需要排除重复元素的情况

实现代码如下:

class Solution {public int longestConsecutive(int[] nums) {int n = nums.length;if (n == 0) {return 0;}// 排序Arrays.sort(nums);// 最小连续序列长度为 1int max = 1;int flag = 1;for (int i = 0; i < n-1; ++ i) {if (nums[i] == nums[i+1] - 1) {// 若连续 则长度增加flag ++;} else if (nums[i] == nums[i+1]) {// 排除连续相等的元素continue;}else {// 不连续 则重新计数flag = 1;}// 时刻更新最长序列max = Math.max(flag, max);}return max;}
}

提交结果如下:

解答成功:

执行耗时:12 ms,击败了98.27% 的Java用户

内存消耗:55.3 MB,击败了95.98% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n × l o g n ) O(n \times log n) O(n×logn), 对数组排序的复杂度;
  • 空间复杂度: O ( 1 ) O(1) O(1)

解法二(哈希表)

思路分析:

  1. 对数组中的每个数进行枚举, 然后再在数组中寻找x+1, x+2, x+3, …, 当匹配到x+y,即此时序列长度为y+1
  2. 但是每次遍历匹配的时间复杂度为 O ( n ) O(n) O(n),涉及到匹配的优化可以考虑使用哈希表来减少匹配的复杂度;即查看一个数是否存在的时间复杂度可以优化为 O ( 1 ) O(1) O(1)
  3. 所以只需要遍历数组元素,然后以每个元素为起点x,持续判断x+?是否存在,即可得到以x为起点的序列长度;
  4. 但是此时的时间复杂度依然为 O ( n 2 ) O(n^2) O(n2),每个元素可能会重复遍历多次, 比如序列[100,4,200,1,3,2]中,以2为起点和以1为起点都会导致重复遍历;
  5. 最优情况是: 只从每个序列的起点开始遍历获取序列长度,例如序列[100],序列长度为1,起点为100, 序列[1,2,3,4],只从起点1遍历一次,而不会再去从2开始遍历[2,3,4];
  6. 所以可以在遍历数组元素时,判断当前元素是否为序列的起点,若为序列起点,则开始匹配序列,并获取序列长度,若不是序列起点,则跳过;
  7. 判断一个元素x是否为序列起点, 可以判断哈希表中是否存在元素x-1,若存在,则说明序列可以从x-1开始,即x不是序列起点; 若不存在,则说明x为序列起点
  8. 同时,需要考虑数组元素的重复情况,以及哈希表的选取,因为不需要绑定数组元素的索引,即不需要使用Map来作为哈希表; 即使用Set作为哈希表即可,同时可以起到去重的作用;

实现代码如下:

class Solution {public int longestConsecutive(int[] nums) {// 定义哈希表Set<Integer> set = new HashSet<>();// 遍历数组 并存入哈希表中去重for (int num : nums) {set.add(num);}// 最长序列长度int maxLen = 0;for (Integer num : set) {// 判断当前元素是否为序列起点if (!set.contains(num-1)) {// 为序列起点 遍历序列获取长度// 当前元素int currentNum = num;// 当前序列长度int currentLen = 1;while (set.contains(currentNum + 1)) {// 序列长度增加++ currentLen;++ currentNum;}maxLen = Math.max(maxLen, currentLen);}}return maxLen;}
}

提交结果如下:

解答成功:
执行耗时:27 ms,击败了59.27% 的Java用户
内存消耗:66.1 MB,击败了6.98% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),只需 O ( n ) O(n) O(n)的遍历数组元素;
  • 空间复杂度: O ( n ) O(n) O(n),需要使用哈希表来存储数组元素;

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

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

相关文章

go标准库---net/http服务端

1、http简单使用 go的http标准库非常强大&#xff0c;调用了两个函数就能够实现一个简单的http服务&#xff1a; func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) func ListenAndServe(addr string, handler Handler) error handleFunc注册一个路…

BGP路由反射器

原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割原则&#xff0c;该原则的根本作用是防止 AS内部的BGP路由环路。因此&#xff0c;在AS内部&#xff0c;一般需要每台…

LabVIEW做二次开发时应该注意哪些方面?

在使用LabVIEW进行二次开发时&#xff0c;以下几个方面需要特别注意&#xff1a; 需求明确化&#xff1a; 确认并详细记录客户的需求&#xff0c;明确系统的功能、性能、可靠性等要求。制定详细的需求文档&#xff0c;并与客户反复确认&#xff0c;避免后期的需求变更和误解。 …

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类&#xff0c;可以将多个对象封装到一个对象&#xff08;bean&#xff09;中。特点是可序列化&#xff0c;提供无参构造器&#xff0c;提供getter方法和setter方法访问对象的属性。名称中…

JAVA代码审计JAVA0基础学习(需要WEB基础知识)DAY2

JAVA 在 SQL执行当中 分为3种写法&#xff1a; JDBC注入分析 Mybatis注入分析 Hibernate注入分析 JDBC 模式不安全JAVA代码示例部分特征 定义了一个 sql 参数 直接让用户填入id的内容 一个最简单的SQL语句就被执行了 使用安全语句却并没有被执行 Mybatis&#xff1a; #…

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

PyTorch和TensorFlow概念及对比

PyTorch和TensorFlow是两个流行的深度学习框架&#xff0c;用于构建和训练机器学习和深度学习模型。它们各自有一些独特的特点和优点&#xff1a; 一 、PyTorch 动态计算图&#xff1a; PyTorch使用动态计算图&#xff08;Dynamic Computation Graph&#xff09;&#xff0c;…

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度&#xff08;像素变换&#xff09; 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法&#xff0c;请参阅本专栏的其…

五、工厂方法模式

文章目录 1 基本介绍2 案例2.1 Drink 抽象类2.2 Tea 类2.3 Coffee 类2.4 DrinkFactory 抽象类2.5 TeaFactory 类2.6 CoffeeFactory 类2.7 Client 类2.8 Client 类运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 Product ( 抽象产品 )3.1.2 ConcreteProduct ( 具体产品 )3.1…

生物信息学新突破:在英特尔 Gaudi 2 上实现 ProtST 蛋白质语言模型加速

引言 随着人工智能技术的快速发展&#xff0c;蛋白质结构预测和语言模型在生物信息学领域扮演着越来越重要的角色。ProtST作为一种新兴的蛋白质语言模型&#xff0c;其性能在英特尔 Gaudi 2 加速器的助力下得到了显著提升。本文将探讨如何利用英特尔 Gaudi 2 加速 ProtST 模型…

哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet&#xff1a;1.2 TreeSet&#xff1a;1.3 LinkedHashSet&#xff1a;1.4 HashMap&#xff1a;1.5 TreeMap&#xff1a;1.6 LinkedHashMap&#xff1a;1.7 总结 2. c中2.1 std::unordered_set&#xff1a;2.2 std::s…

项目实战——外挂开发(30小时精通C++和外挂实战)

项目实战——外挂开发&#xff08;30小时精通C和外挂实战&#xff09; 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1&#xff0c;修改内存中的数据 2&#xff0c;更改内存中…

谷粒商城实战笔记-54-商品服务-API-三级分类-拖拽效果

文章目录 一&#xff0c;54-商品服务-API-三级分类-修改-拖拽效果1&#xff0c;el-tree控件加上允许拖拽的属性2&#xff0c;是否允许拖拽3&#xff0c;完整代码 一&#xff0c;54-商品服务-API-三级分类-修改-拖拽效果 本节的主要内容是给三级分类树形结构加上拖拽功能&#…

Mysql 集群搭建 05

文章目录 1. Mysql主从复制集群搭建1.1 主库配置1.2 从库配置 2. 分库分表2.1 拆分策略2.2 实现技术2.2.1 MyCat概述2.2.2 MyCat入门2.2.3 配置 schema.xml 3. 双主双从4. 双主双从读写分离 1. Mysql主从复制集群搭建 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志…

Dubbo 参数调优指南

在现代微服务架构中&#xff0c;Apache Dubbo 是一款高性能的 Java RPC 框架&#xff0c;它提供了丰富的功能来支持大规模分布式系统的构建。为了确保 Dubbo 服务能够在高并发环境中稳定运行&#xff0c;性能调优是不可忽视的重要环节。本文将深入探讨 Dubbo 的参数调优策略&am…

【知识图谱】人工智能之知识图谱的详细介绍

知识图谱&#xff08;Knowledge Graph&#xff09;作为一种新型的知识表示和组织方式&#xff0c;正逐渐成为信息领域的研究热点。以下是对知识图谱的详细介绍&#xff1a; 一、定义与概念 知识图谱以结构化的形式描述客观世界中概念、实体及其关系&#xff0c;将互联网的信息…

uniapp实现表格的多选功能

记录一下最近在做一个的表格数据多选功能。需求大致为支持多选、支持跨分页的连续选择、支持通过查询框后手动选择数据&#xff08;我是后端选手&#xff0c;前端不太熟悉单纯记录~&#xff09;。 主要思路为&#xff1a; 将table中的唯一id&#xff0c;存入数组tableIds中进…

金融业的等保测评实践与成效:以实际案例为鉴

在数字化浪潮席卷全球的今天&#xff0c;金融业作为信息密集型的行业&#xff0c;其信息安全与业务连续性面临着前所未有的挑战。为了确保金融数据的安全性和业务的稳健运行&#xff0c;金融业积极响应国家信息安全等级保护制度&#xff08;简称“等保”&#xff09;&#xff0…

VMware Cloud Foundation ESXi 主机

一、准备嵌套 ESXi 主机环境# 1)物理 ESXi 主机信息 本次准备用于部署 VCF 嵌套实验环境的物理宿主机的配置信息如下图所示。其实,部署 VCF 环境主要对内存的大小要求比较高,部署完整的管理域相关组件下来差不多就要占用 200 GB左右内存,而对 CPU 和存储的需求可以根据实…