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

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 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
求三连~~~

相关文章
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
131 0
|
1月前
|
索引 容器
两数之和(每天刷力扣hot100系列)
本题要求在数组中找出两数之和等于目标值的下标。解法一为暴力枚举,时间复杂度O(N²),空间复杂度O(1);解法二利用哈希表,将查找时间降为O(1),总时间复杂度O(N),空间复杂度O(N),实现以空间换时间的优化。
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
221 1
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
165 6
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
115 3
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
156 3
|
算法 Python
【Leetcode刷题Python】300. 最长递增子序列
LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
132 1
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
154 0
|
Python
【Leetcode刷题Python】674. 最长连续递增序列
LeetCode 674题 "最长连续递增序列" 的Python解决方案,使用动态规划算法找出给定整数数组中最长连续递增子序列的长度。
208 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
239 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行