Leetcode 最长连续序列

news/2025/2/22 21:44:55/

在这里插入图片描述

算法流程:

  1. 哈希集合去重

    • 通过将数组中的所有元素放入 unordered_set,自动去除重复元素。集合的查找操作是 O(1),这为后续的快速查找提供了保证。
  2. 遍历数组

    • 遍历数组中的每一个元素。对于每个元素,首先检查它是否是某个连续序列的第一个元素。
    • 具体地,如果当前元素的前一个元素 (num - 1) 不在集合中,说明当前元素有可能是某个序列的开始。这是关键步骤,因为如果 num - 1 在集合中,说明当前元素是某个序列的中间元素,不需要再处理。
  3. 序列长度统计

    • 当确定当前元素为某个序列的起点时,进入一个循环,检查当前元素的后一个元素 (num + 1num + 2、… ) 是否存在于集合中。
    • 利用 count() 来检查每个右邻元素是否存在,如果存在则将 currentStreak 加 1 继续统计,直到右邻元素不再存在。
  4. 更新最大长度

    • 每当一个序列结束时,使用 max() 函数更新全局的最大序列长度 longestStreak

代码结构与逻辑重点:

  • 哈希集合的使用 保证了我们能够在 O(1) 时间内查找某个元素是否存在。
  • 通过判断左邻元素是否存在 确保我们只对可能的序列起点进行处理,避免了对所有元素都重复计算。
  • count() 函数的 O(1) 查找时间 确保了我们能在常数时间内判断右邻元素是否存在,从而以线性时间完成整个数组的遍历和处理。

通过哈希集合的使用,算法避免了排序操作(O(n log n)),从而保证了线性时间复杂度 O(n)。

算法思路:

首先利用数组所有元素来初始化一个哈希集(unordered_set),由于集合性质,这一步会自动去除重复元素。

然后我们再去遍历数组每个元素,仅当当前元素是可能是某个最长连续序列的第一个元素时 (左邻元素不存在于哈希集中),我们进行序列长度统计

所以,如果当前元素的前一个相邻元素(num - 1)存在于哈希集中,那么说明当前元素必然不可能是某个最长连续序列的开始元素。这种情况下我们跳过不予处理。

再回到如果当前元素的确是某个可能的最长连续序列的第一个元素时,我们利用 STL 容器的成员函数 count() 来判断当前元素的右邻元素是否存在于哈希集中,并使用一个新的变量(currentStreak)来统计当前最长连续序列的长度,

unordered_set 中,count() 函数的主要作用是检查某个值是否存在于集合中。因为 unordered_set 只存储唯一的元素,因此 count() 要么返回 0,要么返回 1

  • 返回 0:表示该元素不在集合中。
  • 返回 1:表示该元素在集合中。

如果右邻元素存在于哈希集,那么currentStreak 加1,如果不存在于哈希集中则直接跳出循环。

每当跳出循环时,意味着最近一次处理的连续序列的长度已经统计结束,需要和上一次处理的连续序列的长度(currentStreak)进行 max 对比并更新currentStreak

class Solution {
public:int longestConsecutive(vector<int>& nums) {//初始化一个无序集合并且将nums数组中的元素全部加入到这个集合中unordered_set<int> numSet(nums.begin(), nums.end());//最长序列长度int longestStreak = 0;for(int num : nums) {if(numSet.count(num - 1) == 0) {//如果当前元素的前一个连续元素并不存在于集合中,说明当前元素有可能是一个最长连续序列的开头//并且这个最长连续序列目前至少长度为1int currentStreak = 1;//然后逐个+1并在集合中判断是否存在,直到不存在时终止int currentNum = num;while(numSet.count(currentNum + 1)) {currentStreak++;currentNum++;}longestStreak = max(longestStreak, currentStreak);}}return longestStreak;}
};

http://www.ppmy.cn/news/1524097.html

相关文章

深入理解Docker核心原理:全面解析Docker Client

随着云计算与容器技术的飞速发展&#xff0c;Docker已经成为软件开发、部署和运维中的重要工具之一。在Docker的架构中&#xff0c;Docker Client作为用户操作Docker系统的接口&#xff0c;起着至关重要的作用。本文将详细解析Docker Client的核心原理、工作机制、常用命令以及…

复仇时刻 华为的狙击还没结束

文&#xff5c;琥珀食酒社 作者 | 积溪 华为的复仇时刻已到啊 名场面即将再次上演 看过华为和苹果发布会的人 应该都有似曾相识的感觉 去年8月底 雷女士访华第二天 华为发布了Mate 60先锋计划 9月13日苹果发布iPhone 15 恰恰就在这天 华为咔嚓一下 又放出了大折叠屏…

使用Python中的igraph为绘图添加标题和图例

在 igraph 中&#xff0c;可以通过添加标题和图例来增强图形的可读性和表达能力。我们可以使用 igraph.plot 函数进行绘图&#xff0c;并通过它的参数来指定标题和图例。 1、问题背景 在python中的igraph库中&#xff0c;能否为绘图添加图例和标题&#xff1f;在手册或教程中都…

动手学深度学习(pytorch土堆)-02TensorBoard的使用

1.可视化 代码使用了 torch.utils.tensorboard 将数据记录到 TensorBoard 以便可视化。具体来说&#xff0c;它将标量数据记录到目录 logs 中&#xff0c;使用的是 SummaryWriter 类。 代码分解如下&#xff1a; SummaryWriter("logs")&#xff1a;初始化一个 Ten…

Unity 之如何实现基于OpenAI的ChatGPT的聊天机器人

文章目录 前言接入说明Http请求GPT社区库1.C#/.Net的库2.OpenUPM库3.语音对话GPT实现Unity 接入OpenAI1.导入包2.设置你的 OpenAI 帐户3.向 OpenAPI 发出请求4.语音对话功能5.代码实现6.UI界面实现精彩推荐前言 在当前的技术环境中,人工智能聊天机器人越来越普遍。OpenAI的Ch…

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中&#xff0c;Rust开发环境需要依…

CSS实现优惠券透明圆形镂空打孔效果等能力学习

前言&#xff1a;无他&#xff0c;仅供学习记录&#xff0c;通过一个简单的优惠券Demo实践巩固CSS知识。 本次案例主要学习或巩固一下几点&#xff1a; 实现一个简单的Modal&#xff1b;如何进行复制文本到粘贴板&#xff1b;在不使用UI的svg图片的情况下&#xff0c;如何用C…

cyw43012 wifi+蓝牙二合一模块推荐

CYWL6302 超低功耗WiFi蓝牙模块参数介绍: 1、Wi-Fi 4 (802.11n and 802.11ac-friendly) Dual-band (2.4/5 GHz) MCS8 (256-QAM) for 20MHz channels, up to 78Mbps PHY data rate 2、major chip is cyw43012 3、Supports BDR (1Mbps), EDR (2/3Mbps), Bluetooth LE (1/2Mbps…