编程题—leetcode:128. 最长连续序列

【LeetCode最详尽解答】128_最长连续序列 Longest-Consecutive-Sequence 欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!首先,我们需要找到每个递增序列的起始位置,并且舍弃重复的值。所以先使用 将 转换为一个集合。集合中的每个值可能是起始位置,也可能只是序列的一部分。我们只需要找到起始值。考虑列表 。如果不只找起始点,它会计算从 ,, 等开始的序列,导致 (O(n2)(O(n^2)(O( 阅读详情

题目链接

题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目解析

1、题目要求时间复杂度为O(n)
2、用hashmap的key储存数字,value储存当前数字对应的最长连续数列的长度
3、分为以下四种情况

  • 如果hashmap中已经包含,则直接跳过
  • 如果hashmap中仅包含前一个数字,则将当前数字value设为get(num-1)+1,并且将num - get(num-1)的value 也设为et(num-1)+1,可以理解为同一个最长连续数列的开始和结尾的value均为当前的长度
  • 如果hashmap中仅包含前一个数字,则将当前数字value设为get(num+1)+1,并且将num +get(num-1)的value 也设为et(num-1)+1,可以理解为同一个最长连续数列的开始和结尾的value均为当前的长度
  • 如果hashmap中既包含前一个数字,又包含后一个数字,则将当前数字value设为get(num-1)+get(num+1)+1,并且将num - get(num-1)和num +get(num-1)的value 也设为get(num-1)+get(num+1)+1
通过代码
import java.util.HashMap;

class Solution {
    public int longestConsecutive(int[] nums) {
    	int res=0;
    	HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    	for(int i=0;i<nums.length;i++) {
    		if (map.containsKey(nums[i])) {
    			continue;
    		}
    		else if (map.containsKey(nums[i]-1)&&map.containsKey(nums[i]+1)) {
    			int len = map.get(nums[i]-1)+map.get(nums[i]+1);
    			map.put(nums[i]-map.get(nums[i]-1), len+1);
    			map.put(nums[i]+map.get(nums[i]+1), len+1);
    			map.put(nums[i], len+1);
    			res=Math.max(res, len+1);
    		}else if (map.containsKey(nums[i]-1)){
    			int len = map.get(nums[i]-1).intValue();
    			map.put(nums[i],len+1);
    			map.put(nums[i]-len,len+1);
    			res=Math.max(res, len+1);
    		}else if (map.containsKey(nums[i]+1)) {
    			int len = map.get(nums[i]+1).intValue();
    			map.put(nums[i],len+1);
    			map.put(nums[i]+len,len+1);
    			res=Math.max(res, len+1);
    		}else {
    			map.put(nums[i], 1);
    			res=Math.max(res, 1);
    		}
    		
    	}
     	return res;
    }
}
【中等】力扣算法题解析LeetCode128:最长连续序列 本文提出了一种高效算法,用于在未排序整数数组中寻找最长连续数字序列的长度。通过哈希集合存储元素实现O(1)查询,仅处理序列起点减少了冗余计算。算法首先识别连续序列的最小元素作为起点,然后向后扩展计算序列长度,最终返回全局最大值。该方法时间复杂度为O(n),空间复杂度为O(n),能够处理10^5量级的数据,实测执行时间仅14ms,内存消耗58.6MB。关键优化在于跳过非起点元素,避免重复计算,保证线性时间复杂度。 阅读详情

相关推荐

Discrete Optimization (Coursera) 学习笔记 Week 1 introduction (开个帖子)

Week 1 Introduction 这位教授Pascal Van Hentenryck 真的算是优化领域神级别的人物了吧?截一张Google scholar的图大家感受一下… 居然在Coursera上看到了他开的课:Discrete Optimization。试听了几节后,发现讲得很有激情,而且深入浅出。遂决定花暑假跟完这一门课。 这门课每周花两三个小时介绍基础概念,然后得花十几个小时写作业(coding)… 一开始以为Coursera上的课的作业应该不会太难,然后第一次作业(knapsack)我就被

ZJ_11701的博客 656

最长连续序列(LeetCode 128)

但仔细分析这个过程,我们会发现其中执行了很多不必要的枚举,如果已知有一个 x,x+1,x+2,⋯ ,x+y 的连续序列,而我们却重新从 x+1,x+2 或者是 x+y 处开始尝试匹配,那么得到的结果肯定不会优于枚举 x 为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。增加了判断跳过的逻辑之后,时间复杂度是多少呢?我们考虑枚举数组中的每个数 x,考虑以其为起点,不断判断 x+1,x+2,⋯x+1, x+2,⋯ 是否存在,假设最长匹配到了 x+y,其长度为 y+1,我们不断枚举并更新答案即可。

Doublelv 的博客专栏。 1624

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏。

Tina姐的博客 1939

LeetCode第 128 题:最长连续序列(C++)

128. 最长连续序列 - 力扣(LeetCode) 先不考虑时间复杂度要求:排序加去重加遍历 class Solution { public: int longestConsecutive(vector<int>& nums) { if(nums.empty()) return 0; sort(nums.begin(), nums.end()); int idx = unique(nums.begin(), nums.en

zj 717

ADS(Arm Developer Suite)安装的坑!

实验课老师让我们区安装ADS,作为嵌入式开发的工具,原本以为这只是一个简单的软件,但是当我安装的时候,我才发现这软件太难了!安装了我大半天,看了其他的博客之后,最终才安装成功???????? 安装过程的一个巨坑就是:安装路径!以及安装许可注册文件 如果没有注意路径,最后安装成功以后打开软件就是蜜汁报错???? 报错了怎么办?删掉已安装的东西,重新安装吧,而且要删干净 再次安装的时候,打开安装包是这个提示...

weixin_42795819的博客 8218

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2604

LeetCode第128题_最长连续序列

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

qq_40263592的博客 2092

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

LeetCode-题128:最长连续序列

LeetCode-题128:最长连续序列

little_demo_1的博客 402

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

君正T31x metartc集成测试

metartc为国内杨大侠部分开源的一款用于嵌入式领域webrtc库,它与谷歌官方webrtc相比,编译到君正平台的可执行文件仅有5M即可实现webrtc的通信。1. 目前实现的是基于开源版v5.0-b0版本做的简单修改,官方的好几个版本都多少缺点东西,我这里给整理了一下。目前是局域网连接的webrtc,后续尝试走stun和turn试一下NAT穿越的效果。

fsmpeg的博客 3157

C/C++编程题刷题:leetcode 128. 最长连续序列

128. 最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为O(n)。 示例: 输入:[100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 class Solution { public: int longestConsecutive(vector<int>& nums) { if(nums.empty()) r..

Emotion的博客 566

华为OD机试真题 新系统【网络数据包收发处理】

华为OD机试 新系统真题【网络数据包收发处理】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【网络数据包收发处理】多语言题解。

qq_45776114的博客 444

力扣最热一百题——3.最长连续序列

力扣最热一百题——最长连续序列,多种解法,难点辨析。新手也能学会!!!

WenJGo的博客 1958

visio安装包

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

力扣LeetCode 128题:最长连续序列

题目: 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 分析 要找 连续序列 的长度,从结果可以看出,主要是为了排序,排序之后,遍历结果就可以进行连续长度的更新。 但是排序的算法,即使快排的时间复杂度也有O(nlogn),不满足要求。 这种时候一般就会想到借助哈希表,也就是类似计数排序,先来试试,用数组来做哈希表,下标做n

LifeGoesOn 1428

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

力扣热门算法题 127.单词接龙,128.最长连续序列,130.被围绕的区域

​力扣热门算法题 127.单词接龙,128.最长连续序列,130.被围绕的区域,每题做详细思路梳理,配套Python&Java双语代码, 2025.07.07 可通过leetcode所有测试用例。 ​

引用原创内容标明出处即可 1451

【力扣算法】128-最长连续序列

题目 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-consecutive-sequence ...

ZeromaXHe的博客 3337

算法编程题-最长连续序列

本文将分享一道LeetCode原题,并且给出两种方法,代码使用C++实现,并且满足时间复杂度为$O(n)$且全部通过LeetCode的测试用例。

zhuohuashiyi 1352

力扣题解系列:128. 最长连续序列

题目:128. 最长连续序列 题目描述: 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 解题思路: 对于在数组中的元素i,若i-1或者i+1也在数组中,则它们在一个连续序列中。但是同时考虑i-1和i+1就比较麻烦,而且在数组中查找元素的时间复杂度为O(n),不满足题目要求。于是可以只考虑i+1,这样做的前提条件是找到每个连

qq_38813052的博客 464

LeetCode 128.最长连续序列

对于每个元素,最多只会被访问两次,一次作为序列的起点(即内层循环),一次作为序列的一部分(即外层循环),因此时间复杂度为。给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。解释:最长数字连续序列是 [1, 2, 3, 4]。输入:nums = [0,3,7,2,5,8,4,6,0,1]输入:nums = [100,4,200,1,3,2]显然,不能对数组进行排序,因为排序的时间复杂度是。输入:nums = [1,0,1,2]请你设计并实现时间复杂度为。

qq_73593013的博客 941

LeetCode经典题解:128、最长连续序列

本文探讨了如何高效求解“最长连续序列”问题。首先分析了暴力法(O(n³))和排序法(O(n log n))的不足,随后提出基于哈希表的最优解法(O(n))。其核心在于:1)利用哈希表快速查询元素;2)仅从序列起点(即x-1不存在的x)开始向后扩展计数,避免重复计算。文章通过“寻宝游戏”的类比形象化记忆这一逻辑:哈希表作为地图标记数字,只从“特殊宝藏”(序列起点)开始挖掘。这种方法不仅满足时间复杂度要求,还能灵活处理变种问题。

ray的博客 1263

力扣(LeetCode)100题:128.最长连续序列

特点说明时间复杂度 O(n)每个数字最多被访问两次(一次在外层循环,一次在while中),均摊 O(1)空间复杂度 O(n)需要额外集合存储去重后的数字无需排序完全基于哈希查找,避免 O(n log n) 排序开销自动去重集合天然消除重复元素干扰。

sweet_ran的博客 574

Leetcode 每日一题 128.最长连续序列

两种解法都利用了 HashSet 或 HashMap 来减少查找的时间复杂度,使得整体的时间复杂度为 O(n)。HashSet 版的解法更为简洁,而 HashMap 版的解法则提供了一种不同的思路。

weixin_73687229的博客 1295

LeetCode图解 | 128.最长连续序列

点击上方蓝字设为星标下面开始今天的学习~今天分享一个LeetCode题,题号是128,标题是最长连续序列,题目标签是并查集和数组。题目描述给定一个未排序的整数数组,找出最长连续序列的长度...

程序员吴师兄的博客 754

Java实现 LeetCode 128 最长连续序列

128. 最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 class Solution { public int longestConsecutive(int[] nums) { ...

南 墙 1万+

leetcode128. 最长连续序列,哈希表

leetcode128. 最长连续序列,哈希表

热爱C++和golang的学生 918
上一篇: 编程题—leetcode300:最长上升子序列
下一篇: 2020网易笔试第四题
code_AC
博客等级 码龄12年 255粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值