【每日练题-leecode128. 最长连续序列】

从零实现高精度手势检测:OpenCV+MediaPipe模型移植实战(2)(附c++完整代码) 上篇已经介绍了手掌检测的方法。本章将在手掌检测的基础上,完成手指关节的检测。 阅读详情

128. 最长连续序列

给定一个未排序的整数数组 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. 对数组进行排序,这样我们可以更容易地找到连续的数字。
  3. 遍历排序后的数组,对于每个数字,检查它之前和之后的数字是否在哈希表中出现过。如果是,更新当前数字的连续序列长度。
  4. 维护一个变量来记录遍历过程中发现的最长连续序列长度。

代码实现:

class Solution:
    def longestConsecutive(self, nums):
        if not nums:
            return 0
        
        num_set = set(nums)
        max_length = 0
        
        for num in num_set:
            if num - 1 not in num_set:
                # 当前数字是连续序列的开始
                current_num = num
                current_length = 1
                
                while current_num + 1 in num_set:
                    current_num += 1
                    current_length += 1
                
                max_length = max(max_length, current_length)
        
        return max_length

# 示例
solution = Solution()
print(solution.longestConsecutive([100, 4, 200, 1, 3, 2])) # 输出 4
print(solution.longestConsecutive([0, 3, 7, 2, 5, 8, 4, 6, 0, 1])) # 输出 9

这段代码首先定义了一个Solution类,其中包含了longestConsecutive方法来解决这个问题。我们使用了一个集合num_set来存储输入数组中的所有数字,以利用集合的快速查找特性。然后,我们遍历这个集合,对于每个数字,检查它是否是连续序列的开始。如果是,我们就尝试找到这个连续序列的结束,并更新最长连续序列的长度。最后,我们返回找到的最长连续序列的长度。

这段代码是一个算法,用于找出一个未排序的整数数组中最长的连续序列的长度。这里的“连续序列”指的是数字是连续的,但它们在数组中的位置不需要是连续的。

让我们逐步分析代码:

  1. 类定义:

    • class Solution: 定义了一个名为Solution的类,这个类将包含解决问题的方法。
  2. 方法定义:

    • def longestConsecutive(self, nums): 定义了一个方法longestConsecutive,它接收一个数组nums作为参数。
  3. 输入检查:

    • if not nums: return 0 如果数组为空,直接返回0,因为没有连续序列。
  4. 创建集合:

    • num_set = set(nums) 将数组nums转换为一个集合num_set,这样可以快速检查某个数字是否存在。
  5. 初始化最长序列长度:

    • max_length = 0 初始化一个变量max_length来存储最长连续序列的长度。
  6. 遍历集合:

    • for num in num_set: 遍历集合num_set中的每个数字。
  7. 检查序列开始:

    • if num - 1 not in num_set: 检查当前数字num减1是否不在集合中,如果是,则说明num可能是一个连续序列的开始。
  8. 计算连续序列长度:

    • current_num = num 设置当前检查的数字为num。
    • current_length = 1 初始化当前连续序列的长度为1。
    • while current_num + 1 in num_set: 使用一个循环,只要current_num + 1在集合中,就继续增加current_num的值,同时增加current_length。
  9. 更新最长序列长度:

    • max_length = max(max_length, current_length) 每次循环后,比较并更新max_length为当前找到的最长序列长度和之前记录的最长序列长度中的较大值。
  10. 返回结果:

    • return max_length 在遍历完所有数字后,返回记录的最长连续序列长度。

最后,代码中有两个print语句用于测试算法:

  • print(solution.longestConsecutive([100, 4, 200, 1, 3, 2])) 测试用例1,期望输出是4。
  • print(solution.longestConsecutive([0, 3, 7, 2, 5, 8, 4, 6, 0, 1])) 测试用例2,期望输出是9。

这个算法的时间复杂度是O(n),因为它只需要遍历一次集合中的所有数字,并且每次检查和更新操作都是常数时间的。

这段代码的空间复杂度和时间复杂度分析如下:

时间复杂度

  1. 将数组转换为集合:这一步的时间复杂度是O(n),其中n是数组nums的长度。
  2. 遍历集合中的每个元素:这一步的时间复杂度也是O(n)。
  3. 在集合中查找元素:对于每个元素,我们最多执行两次查找操作(检查num - 1和num + 1是否存在),查找操作的平均时间复杂度是O(1)。
  4. 连续序列的增长:对于每个连续序列,我们最多执行n次循环,最坏情况下,这将导致O(n)的时间复杂度。
  5. 即使考虑while循环,总的迭代次数也不会超过数组的长度。

综合考虑,时间复杂度主要由遍历集合和查找操作决定,因此整体时间复杂度是O(n)。

空间复杂度

  1. 创建集合:集合num_set存储了数组nums的所有元素,因此空间复杂度是O(n)。
  2. 变量存储:max_length和current_length等变量占用的内存空间相对于n来说是常数级别的。
  3. 主要由存储集合num_set所需的空间决定。

因此,空间复杂度主要由集合num_set决定,整体空间复杂度是O(n)。

这里的n是数组nums的长度。这个算法在最坏情况下的时间复杂度和空间复杂度都是线性的,符合题目要求的O(n)时间复杂度。然而,实际性能可能会因为输入数据的特性而有所不同,例如,如果输入数组已经排序或者包含大量重复元素,算法的效率可能会更高。

另外在代码中,while循环是用来扩展当前连续序列的。在最坏的情况下,如果数组中的数字已经排序,并且形成了一个最长的连续序列,那么每次循环都将检查序列中的下一个数字,直到序列结束。这意味着while循环可能会执行与连续序列长度相同次数的操作。

假设最长的连续序列包含k个数字,那么while循环将执行k-1次(因为序列的第一个数字在进入循环之前已经被计数了)。因此,对于每个连续序列,我们可能会有O(k)的时间复杂度。

然而,由于我们只对每个数字执行一次这样的while循环,并且所有连续序列的总长度不会超过n(数组的长度),因此总的时间复杂度仍然是O(n)。这是因为即使有多个连续序列,它们加起来的总长度也不会超过数组的长度。

关于空间复杂度,while循环不占用额外的空间,因为它只是用来更新计数器和检查集合中的元素,所以空间复杂度仍然是O(n),由存储集合num_set所需的空间决定。

基因家族Motif 分析 MEME 阅读详情

相关推荐

RTDETR多模态融合实战:基于注意力机制的红外与可见光目标检测优化

本文深入探讨了基于RTDETR模型的红外与可见光多模态目标检测优化方案。针对复杂光照下的检测难题,文章提出并实战演示了如何利用注意力机制(如SimAM与交叉注意力)实现RGB与IR特征的智能动态融合,从而构建更鲁棒的“全天候”检测系统,有效提升安防、自动驾驶等场景在夜间及恶劣天气下的检测精度与可靠性。

weixin_29083373的博客 188

leetcode-最长连续序列

--------------------------------还是不太理解---------------------------------------凌乱的是left、right和num什么关系---------------------------------------------------------------为什么呢?---------------------------------以上内容好理解--------到下面为啥更新端点的位置一下没看出来-------

zchtcsdn的博客 176

网络安全学习路线是怎样的?

为什么要学习安全? 近几年网络安全事件层出不穷,相信大家哪怕没遇到过,但也听过不少了吧。如服务器遭受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦发生,对企业而言都是不小的打击。因此,网络安全不容忽视,同时随着时代的不断发展,公司对于运维及网络工程师要求也越来越严格。未来越来越吃香的一定是技能方向广的复合型人才。网络安全可以说是一条非常好的发展道路。 今年两会期间,全国政协委员,360集团创始人、董事长周鸿祎提交了关于网络安全行业特殊人才的提案,为广大白帽子人员争取更好...

网安技术分享 8697

数组-滑动窗口-不定长度窗口

给定一个未经排序的整数数组 ,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个或多个整数组成,且这些数组内的每个整数都比前一个整数大。示例 1: 示例 2: 提示:这道题的目的是找到数组中最长的连续递增子序列。可以通过一次遍历数组来解决。使用一个变量记录当前连续递增子序列的长度,并用另一个变量记录找到的最大长度。解题步骤: 复杂度分析: 时间复杂度:空间复杂度:给定一个二进制数组 ,计算其中最大连续 的个数。示例 1: 示例 2: 提示:这道题的目的是找出数组中最长的连续

letwant的博客 1089

第四次工业革命如何重构产业逻辑:写给技术人的趋势推演

第四次工业革命正在以人工智能、大数据和新能源为核心重构全球产业逻辑。本文从历史规律切入,指出技术革命本质是生产力跃迁和产业链话语权的转移。当前AI基础设施竞赛已形成算力、数据、算法三大支柱,其中算力投资首超石油领域,绿色算力与新型架构成为关键。数据治理带来隐私计算等新技术约束,数据中心正向液冷技术和"东数西算"模式演进。技术人需构建三大竞争力:夯实分布式系统等底层能力、培养跨领域知识融合能力、善用约束条件驱动创新。这场变革将奖励那些深度理解技术本质并能快速适应的实践者。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 287

从部署到养成:Hermes智能体接入DeepSeek与微信机器人的完整实战指南

智能体(Agent)正成为大模型从“对话”走向“行动”的关键形态。它通过拆解指令、调用工具、执行任务,让AI真正参与工作流。Hermes作为可本地部署的开源智能体框架,支持接入DeepSeek等主流大模型,并提供网关、工具调用、记忆管理等模块化能力。从Docker容器部署到微信机器人桥接,从自动化定时任务到Computer Use桌面控制,Hermes将个人助理从概念落地为可运行的工程系统。本文基于真实实践,梳理架构原理、部署流程、API配置与高频故障排查,为技术玩家提供一套从零到一的上手指南。

weixin_29045001的博客 263

leetcode刷题笔记_排序1

排序 冒泡排序 两两交换,依次把最大值移到最后面 #include <iostream> #include <cstring> #include <vector> #include <map> #include <cmath> #include <set> using namespace std; void busort(vector<int>& arr) { for (int i = 0; i <

timoraty的博客 360

大红球预警版-精选+自定义板块监控

这是一款简单易用的股票大单资金监控插件,兼容通达信软件,可嵌入分时图或定制版面。它以红绿圆球直观显示主力买卖情况(红球为买,绿球为卖),支持300万以上大单语音播报。插件提供实时资金流向分析、多股同时监控、自定义预警条件等功能,无需L2账号。用户可自由切换图形/列表模式,监控特定板块,并配合幻影软件实现自动交易。虽然上涨股通常红球占优,但需结合其他指标综合判断。该插件完全免费,包含详细视频教程,适合新手使用。

guleba的博客 1793

LeetCode hot 100 每日一题(3)--128. 最长连续序列

下面是HashSet在 Java 中的声明和基本用法示例,以及详细解释:在 Java 中,HashSet是一个基于哈希表(HashMap)实现的集合类,用于存储不重复的元素。​它不保证元素的顺序,即元素的插入顺序可能与迭代顺序不同。声明HashSet要使用 HashSet,首先需要导入类。// 创建一个存储字符串的 HashSet Set < String > set = new HashSet < >();

m0_46464899的博客 1375

Vofa+使用笔记(1):用Vofa+通过串口连接显示波形

1. 介绍 Vofa+有三种协议设置 rawdata:你发什么就显示什么,跟普通的串口助手一样 firewater:最简单在VOFA+里绘制波形的协议,建议仅在通道数量不多、发送频率不高的时候使用。 justfloat:有一定的数据格式,此协议非常适合用在通道数量多、发送频率高的时候。 2. 使用步骤 设置号下面三个地方,使用的协议以及传输的方式 拉出控件 (最开始上位机没有识别到你的数据的时候,右边是没有数据显示的,如果你想要y轴显示什么数据,右边设置显示也可以,右键波形图然后Y轴设置也行) 把进

苏释州的博客 5万+

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

王老师青少年编程 2023

Leetcode 128. 最长连续序列(哈希 + 优化)

Leetcode 128. 最长连续序列(哈希 + 优化) 题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 0

专注如一的博客 1399

python实现Markowitz模型 (附完整源码)

python实现Markowitz模型 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 402

LeetCode 128. 最长连续序列

的时间复杂度,则需要使用 hashtable,通过遍历 entry,循环判断 key - 1 是否存在,更新结果。解题思路:先对数组进行排序,然后遍历数组,判断。组队打卡,更多解法等你一起来参与哦!该方法的时间复杂度是。

m0_64381458的博客 1658

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

每日一题--最长连续序列

每天了解一个算法

刚开始学编程的小白 1804

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Leetcode 128.最长连续序列【借助map实现|并查集实现】

文章目录问题描述解题报告实现代码参考资料 问题描述 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)O(n)O(n) 输入:[100,4,200,1,3,2]输入:[100,4,200,1,3,2]输入:[100,4,200,1,3,2] 输出:4输出:4输出:4 解题报告 暴力查找 最粗暴的想法,从每个数字出发,依次查找后面能达到的最长连续序列长度。加上一点...

MD 335

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

力扣每日打卡17 128. 最长连续序列 (中等)

这是刷算法题的第十七天,用到的语言是JS 题目:力扣 128. 最长连续序列 (中等)

2301_79369384的博客 849

每日一题——最长连续序列和uthash.h

每日一题——最长连续序列和uthash.h

zxjiaya的博客 1206

【每日一题】LeetCode. 128. 最长连续序列

每日一题,防止痴呆 = = 一、题目大意 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence 二、题目思路以及AC代码 最开始看到这道题还以为是最长上升子序列呢 = =,仔细一看,原来不是。 思路一 先说一下我自己想到的思路,最后发现还是比官解复杂一点,但感觉出发点是一样的。题目要求求数组中连续的序列,那么.

Johnson的博客 233

每日一题一一Leetcode128. 最长连续序列 - 力扣

好,那么如果num-1不存在,那么说明num有资格,作为数字连续序列的开头,我们就不断询问num+1,num+2,num+3,……在不在集合中,看看什么时候停下来,然后,维护最长序列的长度即可。问这个的目的是判断当前这个num有没有资格作为数字连续序列的开头,你想,如果num-1都存在,那么你以num为头去找一个数字连续序列,那肯定不会是最长的。首先,数组中是有可能出现重复的数字,但是重复的数字其实并不影响我们找数字连续的最长序列,因为再多相同的也只能算一个长度,所以,我们可以先对数组进行一个?

blue的博客 647

leetcode 每日一题 128. 最长连续序列 哈希表

给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 通过次数47,909 提交次数96,272 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 官.

马角的逆袭的博客 230

每日一题(2020-06-6)128. 最长连续序列

[128. 最长连续序列] 难度 困难 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence 解法:哈希表 使用 HashSet 来存储数组中的所有元素, 然后遍历数组中的

答案在路上,自由在风里 206

【LeetCode】128. Longest Consecutive Sequence 最长连续序列(Hard)(JAVA)

【LeetCode】128. Longest Consecutive Sequence 最长连续序列(Hard)(JAVA) 题目地址: https://leetcode.com/problems/longest-consecutive-sequence/ 题目描述: Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence. Follow up:&nbsp

qq_16927853的博客 341

LeetCode-128-最长连续序列

最长连续序列 题目描述:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例说明请见LeetCode官网。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/ 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法一:哈希表 因为哈希查找比较快,所以用哈希表来辅

玉树临风,仙风道骨 146

【每日刷题】最长连续序列

leetcode【128. 最长连续序列】题解

m0_60570002的博客 235

LeetCode128.最长连续序列 每日一题6月6日

问题描述: 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为O(n)。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence 示例: 输入:[100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 解题思路: 题意是时间复杂度为O(n),那么我们肯定不能使用传统排序方法 那么只有使用空间..

wuheng248113004的博客 217
上一篇: 【Swoole 的生命周期,文件描述符,协程数量,以及默认值】
下一篇: 【每日练题-leecode76. 最小覆盖子串】
WishYouAFortune
博客等级 码龄15年 1465粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值