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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本题使用哈希表法求最长连续序列。利用unordered_set存储去重元素,遍历集合时仅当num-1不存在时才作为起点向后扩展,统计连续长度,时间复杂度O(n),空间复杂度O(n)。相比unordered_map更高效,因无需存储值。


题目介绍:

哈希表法:

include

include // for max()

class Solution {
public:
int longestConsecutive(vector& 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_set unordered_map
    存储内容 仅存储键(key) 存储键值对(key-value pairs)
    用途 快速判断元素是否存在(去重、集合操作) 通过键快速查找/访问关联的值(字典)
    元素访问 直接通过键访问 通过键访问对应的值(map[key])
    内存占用 更低(仅存储键) 更高(需存储键和值)
    是否允许重复键 不允许(自动去重) 不允许重复键(但值可重复)
  2. 使用场景

unordered_set s = {1, 2, 3};
if (s.find(2) != s.end()) { / 2存在 / }

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

  1. 在本题中的选择

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

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

  1. 性能对比
  1. 成员函数差异
    操作 unordered_set unordered_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),但它们的解引用行为不同,具体取决于容器类型:

  2. unordered_map 的 begin()

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

  1. unordered_set 的 begin()

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

关键区别
容器 begin() 返回的迭代器解引用结果 访问方式
unordered_map std::pair it->first(键)
it->second(值)
unordered_set 直接是键(Key) *it
求三连~~~

相关文章
|
3天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
14天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1300 5
|
13天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1327 87
|
2天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
181 82
2025年阿里云域名备案流程(新手图文详细流程)
|
7天前
|
前端开发
Promise的then方法返回的新Promise对象的状态为“失败(Rejected)”时,链式调用会如何执行?
Promise的then方法返回的新Promise对象的状态为“失败(Rejected)”时,链式调用会如何执行?
242 127