码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 最长连续序列(哈希解)


    128. 最长连续序列 - 力扣(LeetCode)

    问题描述

    给定一个未排序的整数数组 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

    题解

    如何判断连续序列

    假如x是一个连续序列的起点,那么如果这个连续序列存在于nums中,那么只需要判断x,x+1,x+2,x+3,...,x+n都是否存在于nums中即可,如果这些数字都存在于nums中,那么n+1就是我们返回的结果

    判断一个数是否存在于nums中,显然我们可以使用一个哈希表存储nums中的数,因为在哈希表中判断一个数是否存在的时间复杂度为O(1)

    因此由上述思路,我们可以得到一个解法,枚举nums中每一个数x,判断x之后的x+1,x+2,x+3,...,x+n是否在哈希表中,最后返回结果即可。

    但是还有一个问题是,如何判断我们遍历nums时枚举的数x是一个序列的起点呢?

    判断枚举的数x是否是一个序列的起点

    我们知道,如果一个数是nums中一个连续序列的起点数字,那么x-1,必然不存在于nums中,而我们已经使用了一个哈希表来存储nums中的所有数,因此我们只需要在枚举的时候判断x-1是否存在于哈希表中即可,如果x-1存在于哈希表中,那么该数就不是nums中连续序列的起点,跳过即可,否则就判断其后的数字是否存在,并返回结果

    代码整体思路

    故代码整体思路为:

    • 使用一个set存储nums中的所有数(使用set可以去重)
    • 遍历nums,判断nums[i]-1是否存在于set中
      • 如果num[i]-1存在与set中,说明nums[i]不是一个连续序列的起点,跳过
      • 否则说明num[i]是我们要找的某一个连续序列的起点,接下来判断nums[i]的每一个数是否存在于set中,也就是判断一个连续序列是否存在,并记录连续序列的长度
    • 更新最大连续序列的长度(因为每次找到的连续序列长度不一定是最大的,需要判断)

    代码

    1. class Solution {
    2. public:
    3. int longestConsecutive(vector<int>& nums) {
    4. unordered_set<int> ms;
    5. //去重
    6. for(int num:nums)
    7. ms.insert(num);
    8. int res=0;
    9. for(int i=0;isize();i++)
    10. {
    11. //说明当前元素是一个连续序列的起始位置
    12. if(!ms.count(nums[i]-1))
    13. {
    14. int curNum=nums[i];
    15. int curSeq=1;//记录当前序列长度
    16. while(ms.count(curNum+1))//判断连续序列是否存在
    17. {
    18. curNum++;
    19. curSeq++;
    20. }
    21. res=max(res,curSeq);//更新最长序列长度
    22. }
    23. }
    24. return res;
    25. }
    26. };

  • 相关阅读:
    IP证书怎么申请,如何实现加密保护
    计算机毕业设计Java城镇保障性住房管理系统(源码+系统+mysql数据库+lw文档)
    Jupyter Notebook出错提示An error occurred while retrieving package information解决办法
    【使用python和flask建个人博客】修复侧边栏最新文章、最多阅读等链接不能打开的问题
    DC/DC开关电源学习笔记(六)开关电源电路集成及封装工艺
    【Kafka】KafkaTopic命令
    HTML1:html基础
    【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手
    ShapeableImageView 的使用,告别shape、三方库
    2022年广西壮族自治区中职网络安全技能竞赛“Linux操作系统渗透测试详解”
  • 原文地址:https://blog.csdn.net/qq_58158950/article/details/134396124
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号