最长连续序列(每天刷力扣hot100系列)

目录

题目介绍:

哈希表法:

复杂度分析:

思路分析:

unordered_set 和 unordered_map的比较:

1. 核心区别

2. 使用场景

3. 在本题中的选择

4. 性能对比

5. 成员函数差异

unordered_table.begin()函数是返回的键还是值,unordered_set.begin()函数返回的又是什么呢?

1. unordered_map 的 begin()

2. unordered_set 的 begin()

关键区别


题目介绍

哈希表法:

#include <unordered_set>
#include <algorithm> // for max()class Solution {
public:int longestConsecutive(vector<int>& nums) {if (nums.empty()) return 0; // 处理空数组unordered_set<int> numSet(nums.begin(), nums.end()); // 存储所有数字int maxLen = 0;for (int num : numSet) {// 只处理序列起点(num-1不在集合中)if (numSet.find(num - 1) == numSet.end()) {int currentNum = num;int currentLen = 1;// 扩展连续序列while (numSet.find(currentNum + 1) != numSet.end()) {currentNum++;currentLen++;}maxLen = std::max(maxLen, currentLen); // 更新最大长度}}return maxLen;}
};

复杂度分析:

时间复杂度:O(n),其中 n 为数组的长度。具体分析已在上面正文中给出。

空间复杂度:O(n)。哈希表存储数组中所有的数需要 O(n) 的空间。

思路分析:

这题的思路就是先用哈希表unordered_set装初始nums数组,不需要索引所以用unordered_set而不是unordered_table。

首先遍历哈希表

1.进入条件是必须所在num-1的位置不是连续

2.这时候currentnum和currentlen初始化,currentnum指向num这个数,currentlen为1

3.然后while循环用来计算出在这之后有多少连续的整数

4.如果下一个数字不再连续了,则记录更新maxlen,接着下一轮的循环

5.如果num-1都是连续的,则直接下一轮,直到num-1断了重新初始化(即第2步)

最后返回manlen值。

unordered_set 和 unordered_map的比较:

unordered_set 和 unordered_map是 C++ STL 中的两种哈希容器

1. 核心区别

特性unordered_setunordered_map
存储内容仅存储键(key)存储键值对(key-value pairs)
用途快速判断元素是否存在(去重、集合操作)通过键快速查找/访问关联的值(字典)
元素访问直接通过键访问通过键访问对应的值(map[key]
内存占用更低(仅存储键)更高(需存储键和值)
是否允许重复键不允许(自动去重)不允许重复键(但值可重复)

2. 使用场景

  • unordered_set

    • 检测元素是否存在(如“是否包含数字 5”)。

    • 去重(如统计唯一元素个数)。

    • 集合运算(并集、交集等)。

    示例:

    unordered_set<int> s = {1, 2, 3};
    if (s.find(2) != s.end()) { /* 2存在 */ }
  • unordered_map

    • 建立键到值的映射(如“学生ID到成绩”)。

    • 需要记录额外信息(如数字的出现次数)。

    示例:

    unordered_map<int, string> m = {{1, "Alice"}, {2, "Bob"}};
    cout << m[1]; // 输出 "Alice"

3. 在本题中的选择

  • 为什么用 unordered_set
    您只需要判断数字是否存在,无需存储额外信息(如索引)。unordered_set 更节省内存且语义更直接。

    错误用法(原代码):

    unordered_map<int, int> hashtable; // 存储了无用的索引
    hashtable[nums[i]] = i; // 值(i)未被使用

    正确用法:

    unordered_set<int> numSet(nums.begin(), nums.end());
    if (numSet.find(5) != numSet.end()) { /* 5存在 */ }

4. 性能对比

  • 插入/查找时间复杂度:两者均为平均 O(1)(最坏 O(n),哈希冲突时)。

  • 空间效率unordered_set 更优(无需存储值)。


5. 成员函数差异

操作unordered_setunordered_map
插入元素insert(key)insert({key, value})
访问元素只能通过迭代器遍历map[key] 或 map.at(key)
删除元素erase(key)erase(key)

unordered_table.begin()函数是返回的键还是值,unordered_set.begin()函数返回的又是什么呢?

在 C++ 的 unordered_map 和 unordered_set 中,begin() 函数返回的是 迭代器(iterator),但它们的解引用行为不同,具体取决于容器类型:


1. unordered_map 的 begin()

  • 返回内容:返回指向第一个键值对(std::pair<const Key, Value>)的迭代器。

  • 访问键和值

    • :用 it->first 或 (*it).first

    • :用 it->second 或 (*it).second

  • 示例

    unordered_map<int, string> m = {{1, "Alice"}, {2, "Bob"}};
    auto it = m.begin();
    cout << it->first;  // 输出键:1
    cout << it->second; // 输出值:"Alice"

2. unordered_set 的 begin()

  • 返回内容:返回指向第一个元素(键本身)的迭代器。

  • 访问元素:直接解引用迭代器(*it)。

  • 示例

    unordered_set<int> s = {1, 2, 3};
    auto it = s.begin();
    cout << *it; // 输出元素:1(键本身)

关键区别

容器begin() 返回的迭代器解引用结果访问方式
unordered_mapstd::pair<const Key, Value>it->first(键)
it->second(值)
unordered_set直接是键(Key*it

求三连~~~

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

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

相关文章

国标渠道研究:专业为渠道策略提供数据支持(渠道调研)

北京国标市场调查有限公司是一家专业的市场调查公司&#xff0c;&#xff08;线上问卷调查&#xff09;&#xff08;第三方市场咨询&#xff09;&#xff08;消费者调查研究&#xff09;专注于为企业提供全方位的渠道研究服务。服务范围包括渠道策略研究、渠道销售数据分析和渠…

深入理解 C 语言中的拷贝函数

目录1. C 语言中的主要拷贝函数2. strcpy&#xff1a;字符串拷贝函数签名示例局限性3. strncpy&#xff1a;指定长度的字符串拷贝函数签名示例局限性4. memcpy&#xff1a;通用内存拷贝函数签名示例优势局限性5. memmove&#xff1a;支持重叠内存拷贝函数签名示例优势局限性6. …

主数据变更流程

主数据&#xff08;如客户、供应商、产品等&#xff09;的变更流程&#xff08;新增、更新、停用等&#xff09;是主数据管理&#xff08;MDM&#xff09;的核心环节&#xff0c;其设计需兼顾数据质量&#xff08;准确性、一致性&#xff09;、业务合规&#xff08;审批权限、审…

VUE2 学习笔记 合集

​​​​​​​VUE2 学习笔记1 VUE特点、开发者工具、入门Demo-CSDN博客 VUE2 学习笔记2 数据绑定、数据代理、MVVM_vue2的数据绑定-CSDN博客 VUE2 学习笔记3 v-on、事件修饰符、键盘事件_vue2组件 点击事件-CSDN博客 VU2 学习笔记4 计算属性、监视属性-CSDN博客 VUE2 学习…

【motion】HumanML3D 的安装1:环境搭建

https://github.com/EricGuo5513/HumanML3D/issues/10 (base) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/15_HumanML3D# conda env create -f environment.yaml Retrieving notices: ...working... done Channels:- defaults Platform: linux-64 Collecting

Pig Cloud遇到websocket不能实现同一个用户不同浏览器接受到广播的消息解决方案

自定义SecuritySessionKeyGenerator类,为每个客户端连接建立唯一的keypackage com.pig4cloud.plugin.websocket.custom;import com.pig4cloud.plugin.websocket.holder.SessionKeyGenerator; import org.springframework.web.socket.WebSocketSession;import java.util.UUID; p…

蓝讯hifi添加自定义算法

总结 自己定义算法要添加在hifi工程里 hifi工程在wiki上可以下载,名字叫做project 在main.c里添加了自己的算法,算法的执行涉及到通道与effect_id 编译hifi项目需要安装 XtensaTool 与hifi4 configuration file 编译成功后移植bin文件 通过hifi4_effect_audio_process调用hifi…

【软考中级网络工程师】知识点之 STP 协议,网络的 “交通协管员”

目录一、STP 协议初相识二、STP 协议登场&#xff0c;网络环路难题迎刃而解2.1 网络环路困境2.2 STP 协议闪亮登场三、STP 协议核心探秘&#xff1a;生成树算法3.1 选举根网桥3.2 确定根端口3.3 选定指定端口四、STP 协议端口状态解析4.1 阻塞状态4.2 监听状态4.3 学习状态4.4 …

分布式网关技术 + BGP EVPN,解锁真正的无缝漫游

无线漫游的核心挑战与标准化协议支持在构建高性能无线网络时&#xff0c;实现用户终端&#xff08;STA&#xff09;在不同接入点&#xff08;AP&#xff09;之间平滑、快速的漫游是核心目标之一。我们的无线AP产品原生支持业界标准的802.11k/v/r协议&#xff08;常称为“快速漫…

广东省省考备考(第六十七天8.5)——资料分析、数量(强化训练)

资料分析 错题解析解析今日题目正确率&#xff1a;87% 数量&#xff1a;数学运算 错题解析解析解析解析标记题解析解析今日题目正确率&#xff1a;73%

FLAN-T5:大规模指令微调的统一语言模型框架

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 一、核心定义与原始论文 FLAN-T5是Google于2022年提出的指令微调&…

jenkins插件Active Choices的使用通过参数动态控制多选参数的选项

title: jenkins插件Active Choices的使用通过参数动态控制多选参数的选项 tags: - jenkins categories: - 学习语录Jenkins Active Choices 插件&#xff1a;通过参数动态控制多选参数选项一、插件介绍Active Choices 插件&#xff08;以前称为 Uno Choice 插件&#xff09;是…

Matplotlib(六)- 坐标轴定制

文章目录一、坐标轴概述1. 坐标轴介绍2. 坐标轴相关属性二、坐标轴1. axes() 方法介绍2. 示例&#xff1a;添加多个绘图区域三、坐标轴的刻度1. 坐标轴的刻度介绍2. 刻度定位器和格式器2.1 刻度定位器2.2 刻度格式器2.3 示例&#xff1a;刻度定位和格式3. 刻度样式3.1 tick_par…

【物联网】基于树莓派的物联网开发【22】——树莓派获取传感器数据实时存储实战

场景介绍 今天程序猫带领大家如何实时获取树莓派传感器温湿度数据&#xff0c;并自动存储到数据库中。确保数据的持续性。 实现过程 硬件连接 树莓派4b连接GPIO引脚与DHT11传感器; 硬件只涉及树莓派、DHT11传感器。 DHT11的信号引脚连接树莓派的GPIO17&#xff0c; DHT11的Vdd&…

Linux DNS缓存与Nginx DNS缓存运维文档

一、Linux DNS缓存机制与配置 1. Linux DNS缓存原理 Linux系统中的DNS缓存主要通过以下几种方式实现&#xff1a; ​** nscd(Name Service Caching Daemon)**​&#xff1a;系统级缓存服务&#xff0c;可缓存DNS解析、主机名解析等信息​dnsmasq​&#xff1a;轻量级DNS转发器和…

Java开发时出现的问题---并发与资源管理深层问题

Java 并发模型基于 JVM 内存模型&#xff08;JMM&#xff09;&#xff0c;资源管理涉及 IO、线程、锁等关键组件。若对并发语义、资源生命周期理解不透彻&#xff0c;易引发死锁、内存泄漏、数据错乱等严重问题。1. 并发三大特性&#xff08;可见性、原子性、有序性&#xff09…

从「同步」到「异步」:用 aiohttp 把 Python 网络 I/O 榨到极致

目录 一、写在前面&#xff1a;为什么 IO 是瓶颈 二、同步模型&#xff1a;requests 的忧伤 三、线程池&#xff1a;用并发掩盖阻塞 四、aiohttp&#xff1a;让「等待」非阻塞 4.1 安装与版本约定 4.2 异步客户端&#xff1a;asyncio aiohttp 4.3 错误处理与超时 4.4 …

MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程

&#x1f680; MySQL 在麒麟系统上部署使用 DBeaver 远程连接 SQL 数据导入完整流程适用于国产操作系统&#xff08;如&#xff1a;麒麟 / 统信 / Ubuntu&#xff09;和 MySQL 8.0。包含远程配置、授权连接、SQL 导入、DBeaver连接配置等常见问题解决方案。&#x1f4e6; 环境…

C语言-指针初级(指针定义、指针的作用、指针的计算、野指针、悬空指针、void类型指针)

本章概述思维导图&#xff1a;C语言指针指针是C语言中最强大但也最容易混淆的特性之一。它提供了直接操作内存地址的能力&#xff0c;使得C语言具有高效性和灵活性。下面我将详细介绍C语言指针的各个方面。指针定义指针的本质&#xff1a;指针是一个变量&#xff0c;其值为另一…

具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?

前言尽管当前的视觉-语言-动作&#xff08;VLA&#xff09;模型已展现出显著进展&#xff0c;但其在新场景和与复杂物体交互中的性能会显著下降&#xff0c;在遵循指令方面落后于像LLaVA 这样的大型多模态模型&#xff08;LMM&#xff09;。这种局限性源于现有VLA模型对存在固有…