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

用了7年的 source insight 3.5 背景色及字体配置(提升code效率) 在此记录并share用了7年的 source insight 3.5 背景色及字体配置,提升阅读代码效率 阅读详情

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所需的空间决定。

SAP SEGW 事物码里的 Association 建模方式 Association 模型用于描述 OData 模型里不同 Entity Type 之间的关联关系。我们来看一个具体的例子:Principal Entity(主体):代表 association 的主导端。Cardinality(基数):指定主体实体类型和依赖实体类型之间的关系。按 F4 或点击从列表中选择。关联的多重性如下:为引用约束()指定以下参数,目的是将主体实体类型的每个键,关联到从属实体类型的一个属性:Referential Constraints 的一个例子如下: 引用约束(Referenti 阅读详情

相关推荐

FlightStream实战:如何用面元法在笔记本电脑上完成无人机气动分析(附NASA案例)

本文详细介绍了如何利用FlightStream面元法在笔记本电脑上高效完成无人机气动分析,包括其核心技术优势、NASA D8案例实战解析及高效工作流建立。FlightStream作为快速CFD分析工具,显著提升了早期设计阶段的迭代速度,适用于概念设计验证和多气动构型比较。

weixin_28363123的博客 257

leetcode-最长连续序列

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

zchtcsdn的博客 176

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 636

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

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

letwant的博客 1089

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

用Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理

A20802013的博客 2万+

ArcGIS投影变换实战:从WGS_1984到Krasovsky_1940_Albers的精准转换

本文详细解析了在ArcGIS中如何将WGS_1984地理坐标系下的数据精准转换至Krasovsky_1940_Albers投影坐标系。文章通过实战案例,重点阐述了地理坐标系与投影坐标系的区别,并逐步演示了创建自定义地理变换、使用投影栅格工具以及进行批量处理和结果验证的核心操作流程,旨在解决地图数据叠加不准的常见问题。

weixin_29251131的博客 462

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

【上海大学计算机组成原理实验报告】六、内存系统实验

学习内存访问机制//理解代码和数据的分区存放原理和技术//手动方式把立即数`33H`写入内存`D1H`单元//手动方式把`D1H`单元的内容读出,再送入`ST`单元//在`CP226`汇编语言程序集成开发环境下编写程序//既然有`ORG`微指令,为什么集成开发环境下载到实验箱的目标程序的第一条执行语句最好存放在0号地址?//上海大学计算机组成原理实验//内存系统实验

HackerKevon的博客 3128

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

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

m0_46464899的博客 1375

C++面向对象编程-继承与派生练习题

2、共同派生类 3、人员类Person的派生(虚基类的使用)

编程小鹏的博客 1191

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

bjzhang75的博客 683

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

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

专注如一的博客 1399

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

LeetCode 128. 最长连续序列

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

m0_64381458的博客 1658

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

每天了解一个算法

刚开始学编程的小白 1804

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

力扣每日打卡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

算法(LeetCode_128_最长连续序列)

算法 概:今日份的每日一题,第一次在Leetcode上AC困难算法,之前一直是对困难难度带有恐惧的,不过大概也就是这道题在困难中也不算特别的难(虽然我还是看了题解才做出来),记录一手。 来源:力扣(LeetCode) 链接:最长连续序列 题目 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 思路 第一反应是要对其排序来着

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值