最长连续序列代码中的细节解读

news2024/9/29 15:32:30

最长连续序列

一、题目概述

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

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
在这里插入图片描述
原题地址:https://leetcode.cn/problems/longest-consecutive-sequence/description/?envType=study-plan-v2&envId=top-100-liked

解题说明官方说的很清楚了,我这里只对代码中的细节做一下笔记。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> num_set;

        for(const int& i : nums){
            num_set.insert(i);
        }  

        int longest = 0;

        for(const int& i : nums){
            if(!num_set.count(i - 1)){

                int currentNum = i;
                int currentLen = 1;
                while(num_set.count(currentNum + 1)){
                    currentLen += 1;
                    currentNum += 1;
                }
                longest = max (longest,currentLen);
            }
        }
        return longest;
    }
    
};

二、 unordered_set说明

在 C++ 中,std::unordered_set 是一个非常有用的容器,它是标准模板库(STL)的一部分。std::unordered_set 提供了一种方式来存储唯一元素的集合,其内部实现基于哈希表。由于哈希表的特性,std::unordered_set 在很多方面与 std::set 相区别,尤其是在性能和存储组织方面。


(一)主要特性和用途:

唯一性:

与 std::set 一样,unordered_set 中的每个元素都必须是唯一的。

无序:

不同于基于红黑树的 std::set,unordered_set 中的元素是无序存储的。这意味着你不能依赖于元素的任何排序。

哈希表实现:

unordered_set 使用哈希表来存储元素。因此,它的性能对于哈希函数的质量非常敏感。

(二)性能特点:

平均时间复杂度:
  • 插入操作:O(1)。在最佳情况下,向 unordered_set 插入一个新元素的时间复杂度是常数级的。
  • 查找操作:O(1)。查找元素的平均时间复杂度也是常数级的,这是哈希表的一个显著优势。
  • 删除操作:O(1)。删除特定元素的平均时间复杂度同样是常数级的。
最坏情况时间复杂度:

在最坏的情况下(例如所有元素都映射到同一个哈希桶中),这些操作的时间复杂度会退化到 O(n)。

(三)使用场景:

  • 当你需要快速查找、插入和删除元素,并且不关心元素的顺序时,unordered_set 是一个很好的选择。
  • 适用于需要唯一元素集合的场景,但与 std::set 不同,它不提供任何排序保证。

三、使用 const 和引用符号 & 在 for 循环中有特定的目的和优势:

(一)使用 const:

const 关键字用于指定变量的值是不可修改的。
在这个上下文中,它表示 num 是一个不可变的引用。这是一个良好的编程实践,尤其是在遍历容器而不需要修改元素的情况下,因为它可以防止在循环内部意外修改元素的值。

(二)使用引用符号 &:

  • 引用符号 & 用于创建一个变量的引用,而不是拷贝。在这段代码中,num 是 nums 集合中每个元素的引用。这意味着循环在迭代过程中不会创建 nums 中元素的副本,从而提高了效率,尤其是在遍历大型对象或容器时。

  • 如果不使用引用(即不使用 &),循环会为 nums 集合中的每个元素创建一个副本,这会增加额外的内存和性能开销。对于基本数据类型(如 int),这种开销可能微不足道,但对于大型或复杂的对象类型,使用引用可以显著提高效率。

  • for (const int& num : nums) 这种写法是一种高效且安全的迭代方式,它确保了循环过程中不会意外修改集合元素,同时避免了不必要的复制,提升了性能。这是一种符合 C++ 最佳实践的写法。

道阻且行,未来可期。

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

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

相关文章

JavaSE基础50题:9. 求1~100内的所有素数

【概述】 素数&#xff1a;只能被1和自己整除。 素数的判断方法&#xff1a; 我们把非素数都写成 ab 的形式&#xff0c;如&#xff1a; 16 116 16 28 24 124 24 212 24 38 24 46 同样&#xff0c;我们发现&#xff0c;a 和 b 其中一定会有一个数字 < 根号n&#xff0…

【黑马甄选离线数仓day09_会员主题域开发_DWD和DWM层】

拉链表流程 1.从ODS层获取增量数据(上一天新增和更新的数据) 2.拿着DWD原始拉链表数据 left join 增量数据 ,修改原始拉链中历史数据的结束时间 3.拿着left join 的结果集 union all 增量数据 4.把最新的拉链数据优先保存到DWD对应的临时表中 5.使用insertselect 方式把临时表中…

AcW730.机器人跳跃问题(二分法)-Java版

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;//由题目可知,无论能量大与小,都满足 e 2 * e - h[i]; //初始能量越大,最终的结果越大,要找到一个满足条件的最小值 //可以根据二分的向左找模板: /*if(check(mid)) r mid;els…

【电源专题】什么是电源管理

电源管理为什么重要? 在电子系统和电路的设计中,负载往往需要恒定的电流电压,所以最先考虑的就是电源电路的设计。电源管理所考虑的问题是如何将电源有效分配给系统的不同组件,保障系统不同的负载正常运行。 如电源的输入是交流 (AC) 或直流 (DC)?输入电压是高于或低于输…

VSCode 开发C/C++实用插件分享——koroFileHeader

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader 一、koroFileHeader二、使用步骤1.安装2.头文件注释配置3.函数注释配置 一、koroFileHeader 在有些场景下&#xff0c;我们需要在文件头添加一些作者、文件描述、时间和版权描述…

【网络奇缘】- 计算机网络|分层结构|深入探索TCP/IP模型|5层参考模型

​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 OSI参考模型与TCP/IP参考模型相同点 OSI参考模型与TCP/IP参考模型不同点 面向连接三阶段&#xff08…

DFT新手教程:VASP中ISIF取值设置

新手初学VASP计算时首先接触到的就是结构优化的计算任务。 在结构优化中&#xff0c;INCAR中的关键参数包括 IBRION &#xff0c;NSW&#xff0c;ISIF&#xff0c;EDIFF和EDIFFG 各个参数均可在vaspwiki查到可设置的参数以及该参数所具有的设置的含义。 https://www.vasp.at/…

软件平台架构设计与技术管理之道笔记

软件平台架构设计与技术管理之道笔记 认知 领导软件平台各方面的工作&#xff0c;对技术底蕴、思维模式、决策能力、工作风格、文化铸造等方面都有极高的要求&#xff0c;可以称之为“领域智慧”。认知盲区的代价是巨大的&#xff0c;“不知”比“不会”的后果更严重&#xf…

JFrog----常见的开源协议以及应用注意点

文章目录 1. MIT 许可证2. GPL&#xff08;通用公共许可证&#xff09;3. LGPL&#xff08;较宽松的通用公共许可证&#xff09;4. Apache 许可证 2.05. BSD 许可证开源协议的选择和注意点结论 开源软件近年来在软件开发中变得越来越流行。使用开源软件可以节省时间和资源&…

使用typescript搭建express

使用typescript搭建express 开始 为这个项目创建一个新的目录&#xff0c;使用下面的命令初始化项目并创建一个包。 NPM init -y初始化后&#xff0c;让我们安装必要的包 npm i express dotenv cors helmet body-parser 在express中配置typescript npm i -D typescript typ…

C语言--每日选择题--Day35

第一题 1. 有如下定义&#xff1a;(x y) % 2 (int) a / (int) b 的值是&#xff08;&#xff09; int x 3; int y 2;float a 2.5; float b 3.5; A&#xff1a;0 B&#xff1a;2 C&#xff1a;1.5 D&#xff1a;1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

具有五层协议的网络体系结构

目录 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 2、数据链路层 3、网络层 4、传输层 5、应用层 三、数据在各层之间传输的过程 一、计算机的网络体系结构 二、五层协议的体系结构 1、物理层 利用传输介质为通信的网络结点之间建立、管理和释放物理连…

SQL Sever 基础知识 - 数据筛选(3)

SQL Sever 基础知识 - 四、数据筛选 第7节 BETWEEN7.1 BETWEEN 运算符概述7.2 BETWEEN 示例7.2.1 BETWEEN 与数字示例7.2.2 BETWEEN 和日期示例 第8节 LIKE8.1 LIKE运算符概述8.2 转义字符8.3 LIKE 示例8.3.1 % (百分号) 通配符示例8.3.2 _(下划线)通配符示例8.3.3 [字符列表] …

SAP GRID-ALV复选框+GRID事件

实现功能: 复选框\设置复选框是否可编辑\实现changed_finished事件. 一、ALV增加复选框&#xff1a; 1.1、在输出内表里增加一个SEL的字段&#xff1a; sel TYPE c, 1.2、在build_fieldcat FORM里设置checkbox属性和edit属性&#xff0c;并输出SEL字段&#xff1a;…

机器学习——logistic回归

在之前实验接触到的机器学习算法都是的目的都是对数据集进行分类&#xff0c;即预测得到的结果是数据样本所属的类别&#xff0c;预测输出结果是离散的集合&#xff0c;比如{‘是’&#xff0c;‘不是’}。这次实验学习的是回归模型&#xff0c;与分类模型不同的是&#xff0c;…

基于springboot+vue的景区民宿预约系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

xxljob入门案例与配置

1 配置执行器 在任务调度中心&#xff0c;点击进入”执行器管理”界面, 如下图: 1、此处的AppName,会在创建任务时被选择&#xff0c;每个任务必然要选择一个执行器。 2、”执行器列表” 中显示在线的执行器列表, 支持编辑删除。 以下是执行器的属性说明&#xff1a; 属性名…

postgresql pg_hba.conf 配置详解

配置文件之pg_hba.conf介绍 该文件用于控制访问安全性&#xff0c;管理客户端对于PostgreSQL服务器的访问权限&#xff0c;内容包括&#xff1a;允许哪些用户连接到哪个数据库&#xff0c;允许哪些IP或者哪个网段的IP连接到本服务器&#xff0c;以及指定连接时使用的身份验证模…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

JDK8新特性——Stream流

文章目录 一、Stream流体验二、Stream流的创建三、Stream流中间方法四、Stream流终究方法 Stream流&#xff08;也叫Stream API&#xff09;。它是从JDK8以后才有的一个新特性&#xff0c;是专业用于对集合或者数组进行便捷操作的 一、Stream流体验 需求&#xff1a;有一个Lis…