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

最长连续序列

一、题目概述

给定一个未排序的整数数组 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.mzph.cn/news/196985.shtml

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

相关文章

C语言入门基础知识(一)

#C语言基础知识入门 说明C语言代码块结构 #include <stdio.h> //这个语句的功能是进行有关的预处理操作。include称为文件包命令&#xff0c;后面尖括号中内容称为头部文件或收文件。 #include "demo.h" //导入的是工程内部的头文件 int main() { //main 函…

【踩坑】解决maven的编译报错Cannot connect to the Maven process. Try again later

背景 新公司新项目, 同事拷给我maven的setting配置文件, 跑项目编译发现maven报 Cannot connect to the Maven process. Try again later. If the problem persists, check the Maven Importing JDK settings and restart IntelliJ IDEA 虽然好像不影响, 项目最终还是能跑起来…

2023-2024-1-高级语言程序设计-第2次月考编程题

注&#xff1a;此前已发布过的题解不再发布&#xff08;原题请在下面位置进行搜索&#xff09;。 7-1-2 排序(算法任意) 本题要求将给定的n个整数从大到小排序后输出&#xff08;可使用任意排序算法&#xff09;。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给…

笔记66:自注意力和位置编码

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a a a a

paddleocr文本检测改进变迁

数据增强&#xff1a; BDA(Base Data Augmentation)&#xff1a;色调变换&#xff0c;透明度变换&#xff0c;旋转&#xff0c;背景模糊&#xff0c;饱和度变换。 图像变换类&#xff1a;AutoAugment&#xff0c;RandAugment 图像裁剪类&#xff1a;CutOut、RandErasing、Hi…

万字长文带你搞定MMUTLBTWU

最近一直在学习内存管理&#xff0c;也知道MMU是管理内存的映射的逻辑IP&#xff0c;还知道里面有个TLB。 今天刚刚好看到了几篇前辈的文章&#xff0c;很是不错&#xff0c;于是这里来一起学习一下吧。 PART 一&#xff1a;MMU 架构篇 MMU&#xff08;Memory Management Uni…

人工智能-A*算法-八数码问题

一&#xff0c;A*算法设计思想 A*算法&#xff08;A-star&#xff09;是一种寻路算法&#xff0c;主要用于游戏、机器人等领域。 它的设计思想是将最短路径搜索问题转化为一个优化问题&#xff0c;通过计算每个节点的评分&#xff08;f(n) g(n) h(n)&#xff09;来寻找最优…

Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll

环境: Win7 旗舰版 64位 Rustdesk1.19自编译客户端 问题描述: Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll "api-ms-win-shcore-scaling-|1-1-1.dll" 是一个系统动态链接库文件,它是Windows操作系统的一…

Ubuntu20.04/Linux中常用软件的安装

文章目录 一、安裝与卸载微信二、安裝与卸载QQ三、安装Chrome浏览器并加入apt更新四、安裝VScode4.1 安装常用插件4.2 减小Ipch缓存&#xff1a; 五、安装代码对比工具Meld六、安裝WPS七、安装PDF阅读器Foxit Reader八、安装文献管理软件Zotero九、安装有道云笔记十、安装远程控…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

MysqlCluster集群部署

1.引言 1.1目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1. 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群…

layui+ssm实现数据表格双击编辑更新数据

layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时&#xff0c;对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…

ElasticSearch学习笔记(一)

计算机软件的学习&#xff0c;最重要的是举一反三&#xff0c;只要大胆尝试&#xff0c;认真验证自己的想法就能收到事办功倍的效果。在开始之前可以看看别人的教程做个快速的入门&#xff0c;然后去官方网站看看官方的教程&#xff0c;有中文教程固然是好&#xff0c;没有中文…

备忘录不小心删了怎么办?如何找回我的备忘录?

如果你的记性不太好&#xff0c;或者每天需要记住、完成的事情很多&#xff0c;那么养成随手记事的好习惯是非常有必要的。因为手机是每个成年人都会随身携带的电子设备&#xff0c;所以直接在手机上记录事情比较简单、便捷。而手机备忘录、便签、笔记等工具类软件&#xff0c;…

简单的界面与数据分离的架构

草图绘制于2021年2月19日 当时用到了&#xff1a;qt的子项目、delegate、view和widget的关系&#xff0c;有感而写的小备忘&#xff0c;2022年底考的软件设计师里面的设计模式虽然可能早已包含&#xff0c;但自己也得有自己啊&#xff0c;要把自己哪怕不成熟的东西也记录下来&…

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的&#xff1a; 1.掌握HDFS的客户端操作&#xff0c;包括上传文件、下载文件、重命名、查看目录等&#xff1b; 2.掌握HDFS的Java API使用&#xff0c;能够利用Java API实现上传、下载等常用操作&#xff1b; 实验内容&#xff1a; HDF…

fastadmin权限树。树形下拉框

fastadmin 笔记 权限树 在构造方法中编写相应的代码 值得一提的是&#xff0c;你的表必须有 id 字段以及 pid 字段。 // 必须将结果集转换为数组$ruleList \think\Db::name("state_list")->field(createtime,updatetime, true)->order(id ASC)->select();…

FTP服务文件上传失败,错误码553的排故过程

本文主要记录文件上传失败&#xff0c;错误码553的排故过程。 1 背景 树莓派通过FTP给嵌入式板卡传输文件&#xff0c;好几套设备&#xff0c;发现有的能传输成功&#xff0c;有的传输不成功。树莓派和嵌入式板卡都一样的&#xff0c;出现问题时感觉很懵。 2 逐项对比 2.1 自…

AF自动登录应用--实现无源码系统单点登录

在企业信息化的进程中&#xff0c;许多组织拥有一系列的老应用系统&#xff0c;这些系统在多年的运行中积累了大量的业务数据和流程。然而&#xff0c;这些老应用系统往往没有设计或实现单点登录&#xff08;SSO&#xff09;功能&#xff0c;用户需要在不同系统之间频繁输入账号…

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 本题是考查强制类型转换和操作符优先级 操作…