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

LeetCode热题100精讲——Top3:最长连续序列【哈希】

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 题目背景
    • 最长连续序列
      • C++解法
      • Python解法

在这里插入图片描述

题目背景

如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解:
蓝桥杯算法竞赛系列第九章·巧解哈希题,用这3种数据类型足矣

最长连续序列

题目链接:最长连续序列

在这里插入图片描述

解题思路:

这道题最直接的想法就是排序,排序之后连续的序列就很容易找到了。但是排序的时间复杂度是 O(NlogN),而题目要求我们时间复杂度为 O(N),所以我们需要另想办法。

想找连续序列,首先要找到这个连续序列的开头元素,然后递增,看看之后有多少个元素还在 nums 中,即可得到最长连续序列的长度了。

由此我们可以想到用空间换时间的思路,把数组元素放到哈希集合里面,然后去寻找连续序列的第一个元素,即可在 O(N) 时间找到答案。

比方说 nums = [8,4,9,1,3,2],我们先找到 1,然后递增,找到了 2, 3, 4,这就是一个长度为 4 的序列。

代码详情:

C++解法

class Solution {
public:
    int longestConsecutive(vector<int>& nums) 
    {
    	// 本题重点在于找到连续序列的第一个值
        // 转化成哈希集合,方便快速判断是否存在某个元素
        unordered_set<int> set;
        for (int num : nums) 
        {
            set.insert(num);
        }
				
      	// 记录结果
        int res = 0;

        for (int num : set) {
            if (set.count(num - 1)) {
                // num 不是连续子序列的第一个,跳过
                continue;
            }
            // num 是连续子序列的第一个,开始继续计算连续子序列的长度
            int curNum = num;
            int curLen = 1;

            while (set.count(curNum + 1)) {
                curNum += 1;
                curLen += 1;
            }
            // 更新最长连续序列的长度
            res = max(res, curLen);
        }

        return res;
    }
};

Python解法

集合的优势就是能够快速判断是否存在某个元素.

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        # 本题重点在于找到连续序列的第一个值
        set_nums = set(nums) # 将数组存放到哈希集合中
        res = 0 # 记录结果

        for num in set_nums:
            # 判断当前值是不是连续序列的第一个值
            if num - 1 in set_nums:
                continue
            
            curNum = num
            curLen = 1

            while curNum + 1 in set_nums:
                curNum += 1
                curLen += 1
            
            res = max(res, curLen)

        return res
        
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~
http://www.dtcms.com/a/85392.html

相关文章:

  • 数的划分(dfs)
  • OpenCV图像拼接项目指南
  • 健康养生:铺就活力生活之路
  • CMake-环境变量介绍
  • 第42章:Secret管理与敏感信息保护
  • 2.go基础语法
  • wpf 后台使用图标字体
  • 快速创建 Java 8 兼容的 Spring Boot 项目(阿里云脚手架)
  • 【模拟面试】计算机考研复试集训(第十三天)
  • wordpress主题使用中常见错误汇总
  • 第二十一章:模板与继承_《C++ Templates》notes
  • MyBatis-Plus(Ⅱ)基本CRUD
  • 用户模块——升级swagger文档更漂亮
  • Git的认识安装及创建配置本地仓库
  • Shebang行的写入
  • qt 对QObject::tr()函数进行重定向
  • 【工程实践/源码阅读】批量文件处理步骤以及如何并行处理
  • Ubuntu下用QEMU模拟运行OpenBMC
  • 解决address already in use报错:如何查看占用某个端口的程序并杀死
  • 【uni-app】引用公共组件
  • 数据预处理流程与关键步骤解析
  • React 开发环境搭建
  • 多个内容滑动轮播图【前端】
  • 第十六次CCF-CSP认证(含C++源码)
  • c++图论(五)之判断图连通
  • 浪潮信息再塑AI+OS格局,联手龙蜥共筑未来
  • 元数据管理系列(一):元数据管理的前世今生
  • 实战3. 利用Pytorch预写好ResNet-18预测电视剧《辛普森一家》中的人物——图像分类
  • Ceph集群2025(Squid版)导出高可用NFS集群(上集)
  • 第一人称动作识别文献阅读——LSTA:用于自我中心动作识别的长短期注意力机制