1.最长连续序列

题目:

给定一个未排序的整数数组 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

示例 3:

输入:nums = [1,0,1,2]
输出:3

提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

解题过程

思路

这道题要求找出一个未排序的整数数组中最长的连续数字序列的长度,而且要求时间复杂度为 O(n)。这意味着我们不能使用像排序这样的时间复杂度为 O(n log n) 的操作。那该怎么解决这个问题呢?

一种有效的方法是利用哈希集合(unordered_set 在 C++ 中)。哈希集合允许我们在常数时间内检查某个元素是否存在。

具体来说,我们可以这样操作:

  1. 将数组中的元素存入哈希集合:这样我们可以快速检查某个数字是否存在。
  2. 遍历数组中的每个元素
    • 如果当前元素是某个连续序列的最小值(即 num - 1 不在哈希集合中),就尝试从这个元素开始,向后查找连续的数字,并记录连续的长度。
  1. 记录最长的连续序列长度:在遍历过程中不断更新最长长度。

这样做的原因是,如果我们从每个可能的序列起点开始查找,就可以避免重复计算。例如,如果 1 不在哈希集合中,那么我们不会从 2 开始查找,因为序列 [2,3,4] 必然包含在以 1 为起点的序列 [1,2,3,4] 中。

代码:

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set(nums.begin(), nums.end());int longest_streak = 0;for (int num : nums) {if (!num_set.count(num - 1)) {  // 如果当前 num 是一个序列的最小值int current_num = num;int current_streak = 1;while (num_set.count(current_num + 1)) {current_num += 1;current_streak += 1;}longest_streak = max(longest_streak, current_streak);}}return longest_streak;}
};

代码解释

  • 哈希集合初始化unordered_set<int> num_set(nums.begin(), nums.end()); 将数组中的元素存入哈希集合,方便快速查找。
  • 遍历数组:对于每个元素 num,检查 num - 1 是否存在。如果不存在,说明 num 可能是一个连续序列的起点。
  • 查找连续数字:从 num 开始,依次查找 num + 1, num + 2, 直到找不到为止,记录连续的长度。
  • 更新最长长度:在查找过程中,不断更新记录的最长连续序列长度。

这种方法确保每个数字最多被访问两次(一次作为起点,另一次作为序列的一部分),所以总时间复杂度是 O(n)。

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

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

相关文章

EfficientVLA:面向视觉-语言-动作模型无训练的加速与压缩

25年6月来自上海交大、哈工大、西安交大和电子科大&#xff08;成都&#xff09;的论文“EfficientVLA: Training-Free Acceleration and Compression for Vision-Language-Action Models”。 视觉-语言-动作 (VLA) 模型&#xff0c;特别是基于扩散的架构&#xff0c;展现出具…

wireshark抓包分析TCP数据包

1、直接从TCP的三次握手开始说起 三次握手就是客户与服务器建立连接的过程 客户向服务器发送SYN(SEQ=x)报文,然后就会进入SYN_SEND状态服务器收到SYN报文之后,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,然后就会进入SYN_RECV状态客户收到服务器的SYN报文,回应一个ACK(AC…

同等学力申硕-计算机统考-历年真题和备考经验

同等学力申请硕士学位考试是比较适合在职人员的提升学位方式&#xff0c;了解过的人应该都知道&#xff0c;现在社会的竞争压力越来越大&#xff0c;为了提高职业生存能力&#xff0c;提升学位在所难免。 一、已有计算机统考历年真题资料 报名过同等学力申硕计算机专业的朋友都…

OSI网络通信模型详解

OSI 模型就是把这整个过程拆解成了 7 个明确分工的步骤&#xff0c;每一层只负责自己那一摊事儿&#xff0c;这样整个系统才能顺畅运转&#xff0c;出了问题也容易找到“锅”在谁那。 核心比喻&#xff1a;寄快递 &#x1f4e6; 想象你要把一份重要的礼物&#xff08;你的数据…

C++ 检测文件大小和文件传输

检测文件的大小 你可以通过标准 C/C 的文件 API 很方便地获取文件的字节大小&#xff0c;以下是几种常用方法&#xff1a; ✅ 方法一&#xff1a;使用 stat() 函数&#xff08;推荐&#xff09; #include <sys/stat.h> #include <stdio.h>off_t get_file_size(co…

Ubuntu 中修改网卡 IP

在 Ubuntu 中修改网卡 IP 地址可以通过以下方法实现&#xff0c;具体取决于你使用的网络管理工具&#xff08;如 netplan、ifconfig/ip 命令或传统 interfaces 文件&#xff09;。以下是常见方法&#xff1a; 方法 1&#xff1a;使用 netplan&#xff08;Ubuntu 17.10 及更新版…

记录学习three.js 为什么 .glTF 是更适合 Web 的 3D 模型格式?——从 .OBJ 到 .glTF 的转变⑭

在上一篇中&#xff0c;我们介绍了如何在 Three.js 中加载 .OBJ 模型。如果你没看过&#xff0c;建议先阅读一下基础内容。然而你很快会发现&#xff0c;.OBJ 虽然入门简单&#xff0c;却并不是 Web3D 场景中的最佳格式。 .OBJ 是什么&#xff1f; .OBJ 是最早期的3D交换格式之…

H递归函数.go

前言&#xff1a;递归函数是一种强大而又充满魅力的编程技巧。它就像是一面神奇的镜子&#xff0c;函数在其中能够调用自身的倒影&#xff0c;从而以一种简洁而优雅的方式解决许多复杂的问题。 目录 一、递归函数是啥玩意儿 二、递归函数的优缺点 优点 缺点 三、递归函数…

软件功能测试的测试标准

一、软件功能测试行业标准概述 软件功能测试行业标准是规范软件测试流程、方法、工具及人员资质的准则&#xff0c;是确保软件产品的功能性、可靠性、易用性等质量特性符合用户需求。这些标准不仅为测试人员提供了明确的指导&#xff0c;也为软件产品的质量控制提供了有力保障。…

EchoEar(喵伴):乐鑫发布与火山引擎扣子联名 AI 智能体开发板

随着生成式人工智能技术的快速发展&#xff0c;大语言模型 (LLM) 正逐步成为推动智能设备升级的核心力量。乐鑫科技携手火山引擎扣子大模型团队&#xff0c;共同推出智能 AI 开发套件 —— EchoEar&#xff08;喵伴&#xff09;。该套件以端到端开发为核心理念&#xff0c;构建…

图像特征检测算法SIFT

SIFT&#xff08;Scale - Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是一种计算机视觉领域的特征提取算法&#xff0c;具有重要的地位和广泛的应用。 算法原理 构建高斯金字塔 &#xff1a; 为了实现多尺度检测&#xff0c;SIFT 算法会构建高斯金…

光纤通道收发器:市场洞察、技术演进与未来机遇

一、引言 在数字化浪潮席卷全球的当下&#xff0c;数据存储与传输的需求呈爆发式增长。光纤通道收发器作为高速、可靠数据存储网络&#xff08;如存储区域网络 SAN&#xff09;中的关键组件&#xff0c;发挥着至关重要的作用。它通过光纤实现服务器、存储设备和交换机之间的数…

candence17.4如何设置两个焊盘之间在TOP与BOTTOM可以存在两根线

为什么要走两根线&#xff1f; 为了过大电流&#xff0c;有时候就需要我们在TOP、BOTTOM两个面走线&#xff0c;同时开窗&#xff0c;然后通过加锡的方式增加过流能力&#xff1b; 当然由于两面都有导线&#xff0c;必然会存在过孔&#xff0c;而过孔的过流能力不仅与过孔孔径…

Dify:参数调节,让LLM从能用到好用的机制

前言 随着大语言模型(LLM)在文本生成、智能对话、技术问答等前沿领域的深度渗透&#xff0c;参数精细化调节已成为开发者驾驭 AI 能力的核心必修课。 本文将系统的解释温度(Temperature)、核采样(Top - P)、截断采样(Top - K)等关键参数的底层作用机制&#xff0c;结合多种场景…

防抖不同的实现

防抖&#xff08;Debounce&#xff09;&#xff1a;在事件被触发后&#xff0c;延迟一段时间再执行函数。如果在延迟期间事件再次被触发&#xff0c;则重新计时。常用于搜索框输入、窗口大小调整等场景。 1.不安装任何依赖和库&#xff0c;编写一个防抖的函数 在utils里面增加…

MySQL 数据库索引详解

一、索引是什么&#xff1f;能干嘛&#xff1f; 类比理解&#xff1a;索引就像书的目录。比如你想查《哈利波特》中 “伏地魔” 出现的页数&#xff0c;不用逐页翻书&#xff0c;直接看目录找关键词就行。数据库里的索引就是帮你快速找到数据的 “目录”。 核心作用&#xff…

【620公司工作记录】

已有数据汇总 好的,完全同意。在编写新代码之前,清晰地盘点我们手中已有的“弹药”是至关重要的一步。 根据您提供的 test/20250610_88_100mm_frame_000.csv 文件头,我来为您完整地解析一下我们当前拥有的全部数据字段。我们的数据是以“行”为单位组织的,每一行都代表一…

SpringBoot 集成Caffeine实现一级缓存

SpeingBoot 集成Caffeine实现一级缓存使我们经常遇到的场景。今天我们具体分享一下&#xff1a; 首先 Caffeine 作为一级缓存&#xff0c;它是 Spring 5.x 默认的本地缓存实现&#xff0c;性能优于 Guava Cache&#xff0c;且支持过期时间设置。缓存执行的流程图如下&#xff…

中科米堆3D自动扫描检测系统三维数字化智能解决方案

3D自动扫描检测系统基于先进的光学、激光或结构光等测量技术&#xff0c;能够快速、准确地获取工件的三维几何数据。在检测过程中&#xff0c;系统通过向被测工件投射特定的光模式&#xff0c;利用高分辨率相机捕捉工件表面的反射光信息&#xff0c;再经过复杂的算法处理&#…

Unity3d中使用Mirror进行自定义消息通信

一、服务端&#xff1a; 1.创建服务端脚本MyServer.cs 继承自NetworkManager类 using Mirror; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MyServer : NetworkManager {[Header(&quo…