当前位置: 首页 > news >正文

LeetCode 面试经典 150_哈希表_最长连续序列(47_128_C++_中等)

LeetCode 面试经典 150_哈希表_最长连续序列(47_128_C++_中等)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(暴力破解法(仅思路)):
        • 思路二(哈希集合):
      • 代码实现
        • 代码实现(思路二(哈希集合)):
        • 以思路二为例进行调试

题目描述:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

输入输出样例:

示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示
0 <= nums.length <= 105
-109 <= nums[i] <= 109

题解:

解题思路:

思路一(暴力破解法(仅思路)):

1、先进行排序后,再进行查找最长连续序列(注意重复元素的处理)。

2、复杂度分析:
① 时间复杂度:O(nlogn)。sort排序为O(nlogn),遍历查找最长连续序列为O(n)。
② 空间复杂度::O(1)。

思路二(哈希集合):

1、解决此问题首先要判断此元素是否是开始元素,假设当前元素是n 判断n-1是否存在,判断n-1是否存在可以自然的想到哈希集合。若当前元素是开始元素,则判断n+1,n+2… 累计连续序列的长度,记录最长的连续的最长序列。

首先需要将集合中的元素进行降重,降重可以想到使用哈希集合。
例: [0,3,7,2,5,8,4,6,0,1] 降重后为 [0,3,7,2,5,8,4,6,1]
① 建立哈希集合unordered_set,移除重复元素(增加查找的速度)。

② 查找最长连续序列时,首先需找到连续序列的头。判断一个元素 num 是否为序列头,可判断集合中是否存在 num - 1(哈希集合满足快速查找),若不存在 num-1 则 num 为连续序列的头。
③ 当 num 是连续序列的头时需接着判断连续序列的长度。通过判断 是否存在 num+1,num+2 … num+n。来确定连续序列的长度。
④ 通过查找各个连续序列来得出最长连续序列

例:[100,4,200,1,3,2]中从元素100开始,99不在哈希表中则100为连续序列的开始元素,连续序列长度为1。再判断4,3存在哈希表中则不记录连续长度。再判断下一个元素,依次进行下去。通过比较记录的连续长度挑选出最长连续序列。
2、复杂度分析:
① 时间复杂度:O(n),边查找边判断连续长度所以时间复杂度为O(n)。
② 空间复杂度:O(n),创建哈希表O(n)。

代码实现

代码实现(思路二(哈希集合)):
class Solution {
public:int longestConsecutive(vector<int>& nums) {// 第一步:将所有唯一的数字插入到unordered_set中unordered_set<int> num_set(nums.begin(), nums.end());// 用来追踪最长连续序列的长度int longest_streak = 0;// 第二步:遍历集合中的每一个数字for (const auto &num : num_set){// 如果集合中不存在num-1,说明num是一个连续序列的起始数字if (num_set.count(num-1) == 0){int count = 1;  // 初始化当前序列的长度为1,num是序列的第一个数字// 第三步:继续检查num+1, num+2, ... 直到不连续为止while (num_set.count(num + count)){count++;  // 如果num+count存在于集合中,则当前序列长度加1}// 第四步:更新最长序列长度longest_streak = max(longest_streak, count);}}// 第五步:返回最长连续序列的长度return longest_streak;}
};
以思路二为例进行调试
#include<iostream>
#include<vector>
#include<unordered_set>
#include<algorithm>
using namespace std;class Solution {
public:int longestConsecutive(vector<int>& nums) {// 第一步:将所有唯一的数字插入到unordered_set中unordered_set<int> num_set(nums.begin(), nums.end());// 用来追踪最长连续序列的长度int longest_streak = 0;// 第二步:遍历集合中的每一个数字for (const auto &num : num_set){// 如果集合中不存在num-1,说明num是一个连续序列的起始数字if (num_set.count(num-1) == 0){int count = 1;  // 初始化当前序列的长度为1,num是序列的第一个数字// 第三步:继续检查num+1, num+2, ... 直到不连续为止while (num_set.count(num + count)){count++;  // 如果num+count存在于集合中,则当前序列长度加1}// 第四步:更新最长序列长度longest_streak = max(longest_streak, count);}}// 第五步:返回最长连续序列的长度return longest_streak;}
};int main(int argc, char const *argv[])
{vector<int> nums={0,3,7,2,5,8,4,6,0,1};  Solution s;cout<<s.longestConsecutive(nums);return 0;
}

LeetCode 面试经典 150_哈希表_最长连续序列(47_128)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/465643.html

相关文章:

  • Qt 为什么控件要用指针创建?
  • PostgreSQL的数据集成之路:ETL+CDC实现实时多源聚合
  • 【环境配置 】WSL2 +ubuntu20.04 +Qt配置+Kits配置
  • 设计架构:模型推理+生成证据视频 (一)
  • Webpack 微应用 vs Vite 微应用:从 __webpack_public_path__ 到 vite-plugin-qiankun
  • 精品网站别墅装修公司排名
  • 构建基于PyTorch的社交媒体情感倾向分析系统:从数据处理到模型部署
  • 经典SQL 50题 | 附带优化方案(更新中)
  • 做网站图结构微信里的小程序怎么打不开
  • SELECT*FROMarticlesLIMIT1;这个日常SQL如何排查潜在陷阱?MySQL数据库使用技巧解析
  • 百度搜索网站图片建设银行小微企业网站进不了
  • 官网设计比较好看的网站php学生管理系统源码免费
  • AWS云上ClickHouse数据仓库部署方案详解
  • 申请完域名怎么做网站在一家传媒公司做网站编辑 如何
  • 【C#.NET】数据验证-防止SQL注入
  • RPC 通信原理与实现:从底层原理到生产实践
  • 全面修复程序启动难题:msvcp140.dll丢失的解决方法
  • 用 Python 实现成语同频判断:结构模式识别的有趣应用(文中含源码)
  • Element中 el-tree 如何隐藏 Tree 组件中的父节点 Checkbox
  • 基于「多模态大模型 + BGE向量检索增强RAG」的航空维修智能问答系统(vue+flask+AI算法)
  • 基于屏幕空间投影面积的剔除(Screen-space Area Culling, SSAC)
  • Google 智能体设计模式:路由总结
  • 大庆网站建设公司哪家好论坛网站怎么建设
  • AI智能体赋能历史和社会科学领域之仿真:崩塌方程式 —— 复杂系统内源性衰退的统一理论与领导力行动框架
  • MATLAB进行数据的各种统计分析
  • Google 智能体设计模式:并行化
  • 数据仓库入门:从超市小票看懂数仓
  • 公众号运营技巧河北省邢台市seo
  • BEVFUSION解读(五)
  • 制造行业档案管理难题,档案宝如何灵活破局?