力扣HOT100之哈希:128. 最长连续序列

news/2025/3/9 10:20:52/

这道题我想的比较简单,先遍历一遍输入的数组,然后将读取到的数字存入一个map容器中(注意,不是unordered_map),数字作为键,布尔变量为值,然后再遍历一遍map,用一个变量temp记录上次循环读取到的值,temp_result用来记录当前遍历到的子序列的长度,一旦遇到当前遍历到的值与上一次遍历到的值不连续的情况,立马将temp_result置为1,然后继续向后遍历,在每次循环中,最终返回的值result与temp_result比较大小,将较大值作为result的新值。

class Solution {
public:int longestConsecutive(vector<int>& nums) {int result = 0;map<int, bool> hash;for(int& i : nums)hash[i] = true;int temp;int temp_result = 0;for(auto it = hash.begin(); it != hash.end(); it++){if(it == hash.begin()){temp_result++;}else{if(temp == it -> first - 1)temp_result++;else{temp_result = 1;}}temp = it -> first;result = max(result, temp_result);cout << it -> first << endl;}return result;}
};

果不其然,通过是通过了,但是耗时太长了,不符合O(n)的时间复杂度要求,后面看了下灵茶山大佬的题解,重新做一遍。
先说下主要原理:先利用unordered_set构建哈希表,然后遍历哈希表中的每一个元素,当遍历到一个元素时,先判断当前元素的上一个元素是否在哈希表中,如果在,就直接跳过本次循环,开启下一次循环,当出现当前元素的上一个元素不在哈希表中时,说明上一段连续的学列已经遍历结束,开启一段新的序列,此时不再跳过循环,而是定义一个循环,在循环内不断查找从当前元素起的最长连续序列,当该循环结束时意味着当前元素为起点的连续序列已经查找完毕,将最后一个元素的数值减去当前元素的值即为当前元素为起点的连续序列长度,再将该长度与之前保存的最长连续子序列的长度作比较,取较大值为新的最长连续子序列的长度。由于哈希表的查找耗时为O(1),虽然代码中写的是一个类似二重循环的结构,但是这个二重循环在大多数情况下会退化为一重循环,经历若干次查找,时间复杂度为O(n)。

class Solution {
public:int longestConsecutive(vector<int>& nums) {int result = 0;unordered_set<int> hash(nums.begin(), nums.end());  //通过集合来构建哈希表for(const int& i : hash){if(hash.find(i - 1) != hash.end())  //确保当前遍历到的元素和上一个元素是连续的continue;//以下是当前元素与上一个元素不连续的情况int j = i + 1;while(hash.find(j) != hash.end())   //该循环用于寻找从当前元素起的连续元素个数j++;result = max(result, j - i);}return result;}
};

这道题还是有难度的。


http://www.ppmy.cn/news/1577789.html

相关文章

Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)

Dify部署参考&#xff1a;Dify Rag部署并集成在线Deepseek教程&#xff08;Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装&#xff09; DifyDeepSeek - Excel数据一键可视化&#xff08;创建步骤案例&#xff09;-DSL工程文件&#xff08;可直接导入&#x…

【时时三省】(C语言基础)赋值语句

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 赋值语句 在C程序中,最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值…

建筑兔零基础自学记录41|cityengine2019生成场地周围建筑模型

安装&#xff1a; 探索城市设计的未来&#xff1a;CityEngine2019永久可用版-CSDN博客 参考步骤&#xff1a; 这也太简单无脑了吧&#xff01; cityengine快速生成城市模型&#xff01;_哔哩哔哩_bilibili 过程记录&#xff1a; 1、因为cityengine2024的版本需要登陆&#x…

VSCode 本人常用快捷键对照:德语键盘 vs. 英语键盘

VSCode已安装的插件 插件名称发布者版本号ESLintMicrosoft3.0.10Prettier - Code formatterPrettier11.0.0Conventional Commitsvivaxy1.26.0SwitcherAdrian Wilczyński1.0.4Auto Rename TagJun Han0.1.10Todo TreeGruntfuggly0.0.226REST ClientHuachao Mao0.25.1Angular Ess…

STC51中INTCLKO 寄存器各个位的作用

在 STC51 系列单片机中&#xff0c;INTCLKO 寄存器是一个重要的中断控制与时钟输出相关寄存器&#xff0c;下面详细介绍其各个位的作用&#xff1a; 寄存器概述 INTCLKO 寄存器地址为 0x8F&#xff0c;它主要用于控制外部中断的使能、定时器溢出信号输出以及时钟信号输出等功…

考研机试常见基本题型

1、求100以内的素数 sqrt()函数在cmath头文件中。 #include <iostream> #include <cmath> using namespace std;int main() {int count 0; // 用于统计素数的个数// 遍历 100 到 200 之间的每一个数for (int num 100; num < 200; num) {bool isPrime true…

Python怎样安装,Windows/Mac/Linux系统安装教程

Python的安装步骤如下&#xff0c;结合不同操作系统和关键注意事项进行说明&#xff1a; 一、Windows系统安装 下载安装包 访问Python官网&#xff0c;点击“Downloads”选择适合的版本&#xff08;推荐稳定版&#xff0c;如3.9或3.10&#xff0c;避免最新版可能的不兼容问题&a…

为AI聊天工具添加一个知识系统 之140 设计重审 之5 文章学 之 引言 之0 主页页面 之2

问题 Q1538、您对我前述文字中最前面的这一段 对今天文字 的 概要文字“对前述文字&#xff08;上一篇博文“纵观三观&#xff08; 加入 &#xff09;”&#xff09;表达 我换了个角度 重说。目的 是要说清楚 并且形成全覆盖的程序。 --邻君子 开合有度&#xff08;视觉 视必…