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

【力扣hot100】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


错误题解:

/*** @param {number[]} nums* @return {number}*/
var longestConsecutive = function(nums) {if(nums.length===0) return 0sort_nums=nums.sort(function(a,b){return a-b})let i = 0let arr_length=1let final_length=[]while(i<sort_nums.length){if(sort_nums[i]===sort_nums[i+1]-1){arr_length++i++}else{final_length.push(arr_length)arr_length=1i++}}final_length.sort(function (a, b) {return a - b})let result = final_lengthreturn result[result.length-1]
};

在这里插入图片描述
未处理当两个相同数字处在连续数字中间的情况,修改后:

/*** @param {number[]} nums* @return {number}*/
var longestConsecutive = function(nums) {if(nums.length===0) return 0sort_nums=nums.sort((a, b) => a - b )let i = 0let arr_length=1let final_length=[]while(i<sort_nums.length){if(sort_nums[i]===sort_nums[i+1]-1){arr_length++}else if(sort_nums[i]===sort_nums[i+1]){}else{final_length.push(arr_length)arr_length=1}i++}final_length.sort((a, b) => a - b )let result = final_lengthreturn result[result.length-1]
};

在这里插入图片描述

能通过,但时间复杂度是O(nlogn),谈谈思路并优化代码结构:

  • 从小到大排序数组nums
  • 遍历数组,遇到连续增大的项则arr_length加1,遇到相同的项则不做处理
  • 遇到不连续的项则将arr_length的值记录在新数组中,并将arr_length重置为1。
  • 新思路是每次循环都更新最大的arr_length值,和我的思路不太一样,我的思路是将数组每次不连续时的值都存在finally_arr数组中,最后再进行一个比较,取出最大的arr_length。

优化代码后

var longestConsecutive = (nums) => {if (nums.length === 0) return 0nums.sort((a, b) => a - b)let max = 1let count = 1for (let i = 0; i < nums.length - 1; i++) {let cur = i, next = i + 1if (nums[cur] === nums[next]) continue // 相同就跳过本次循环if (nums[cur] + 1 === nums[next]) { // 发现连续项 count++count++} else { // 否则,count重置1count = 1}max = Math.max(max, count)}return max
}

思路2

方法2:Set 的查找是 O(1)

  • 查找 Set 中的元素的时间复杂度是 O(1),JS 的 Set 能给数组去掉重复元素
  • 将数组元素存入 set 中,遍历数组 nums
  • 如果 当前项 - 1 存在于 set ,说明当前项不是连续序列的起点,跳过,继续遍历
  • 当前项没有“左邻居”,它就是连续序列的起点
  • 不断在 set 中查看 cur + 1 是否存在,存在,则 count +1
  • cur 不再有 “右邻居” 了,就算出了一段连续序列的长度

代码

var longestConsecutive = (nums) => {const set = new Set(nums) // set存放数组的全部数字let max = 0for (let i = 0; i < nums.length; i++) {if (!set.has(nums[i] - 1)) { // nums[i]没有左邻居,是序列的起点let cur = nums[i]let count = 1while (set.has(cur + 1)) { // cur有右邻居cur+1cur++ // 更新curcount++ }max = Math.max(max, count) // cur不再有右邻居,检查count是否最大}}return max
}作者:笨猪爆破组
链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/277084/fang-fa-cong-yi-dao-nan-bing-cha-ji-fang-fa-bu-hui/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法3:哈希表

来源于力扣大佬

  • 哈希表的value存什么
  • key存数字,value存什么?
  • 新存入的数字,如果它找到相邻的数,它希望从邻居数那里获取什么信息?
  • 很显然它希望,左邻居告诉它左边能提供的连续长度,右邻居告诉它右边能提供的连续长度
  • 加上它自己的长度,就有了自己处在的连续序列的长度
    在这里插入图片描述

更新新序列的两端数字的value

同处一个连续序列的数字的value理应都相同,这是它们共同特征
但没有必要每个的value都是序列长度,只需要两端的数存序列的长度就好
因为靠的是两端和新数对接,序列是连续的,中间没有空位
序列的一端找到邻居后,将另一端对应的value更新为最新的序列长度

在这里插入图片描述

方法3 代码

var longestConsecutive = (nums) => {let map = new Map()let max = 0for (const num of nums) { // 遍历nums数组if (!map.has(num)) { // 重复的数字不考察,跳过let preLen = map.get(num - 1) || 0  // 获取左邻居所在序列的长度 let nextLen = map.get(num + 1) || 0 // 获取右邻居所在序列的长度 let curLen = preLen + 1 + nextLen   // 新序列的长度map.set(num, curLen) // 将自己存入 mapmax = Math.max(max, curLen) // 和 max 比较,试图刷新maxmap.set(num - preLen, curLen)  // 更新新序列的左端数字的valuemap.set(num + nextLen, curLen) // 更新新序列的右端数字的value}}return max
}作者:笨猪爆破组
链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/277084/fang-fa-cong-yi-dao-nan-bing-cha-ji-fang-fa-bu-hui/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

【力扣hot100】128.最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…...

css的text-shadow详解

CSS的text-shadow属性用于为文本添加阴影效果&#xff0c;以增强文本的立体感和印刷品质感。该属性可以接受多个值&#xff0c;每个值通过空格分隔&#xff0c;以定义阴影的各个方面。以下是text-shadow属性的详细介绍&#xff1a; 阴影颜色 (Color): 这是阴影的颜色值。它可以…...

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)

Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字&#xff1a; Qt、 unique、 单一、 QSharedMemory、 共享内存 摘要 今天接着在公司搞我的屎山代码&#xff0c;按照…...

【生活知识-茶叶】

生活知识-茶叶 茶 茶 茶叶分类代表茶名功效绿茶龙井碧螺春 毛峰清热解毒、降脂减肥、提神醒脑、改善肝功能、减轻肝脏负担乌龙茶铁观音武夷岩茶冻顶乌龙茶清心明目、提神醒脑、促进新陈代谢、维护肝脏健康白茶白毫银针白牡丹贡眉清热降火、抗氧化、保护心血管、提高免疫力黄茶…...

[AIGC] 在Spring Boot中指定请求体格式

在使用Spring Boot开发Web应用的时候&#xff0c;我们经常会遇到需要接收并处理HTTP请求的情况。一个HTTP请求通常包括一个请求行、若干请求头和一个请求体。请求体在POST和PUT请求中特别重要&#xff0c;因为它通常用于向服务器传递数据。 文章目录 创建并使用一个Java Bean指…...

4核16G服务器租用优惠价格,26.52元1个月,半年149元

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年&#xff0c;配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge&#xff0c;4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…...

2024 Mazing 3 中文版新功能介绍Windows and macOS

iMazing 3中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序。iMazing中文版与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰…...

npm设置淘宝镜像

使用npm安装依赖时很慢&#xff0c;可以设置淘宝镜像&#xff0c;2024年1月更换了新域名。 cmd在终端中做以下操作&#xff1a; 检测现在的镜像地址 npm config get registry如果不是淘宝最新的镜像地址&#xff0c;更换为 // 清空缓存 npm cache clean --force // 切换新源…...

现代卷积神经网络

深度卷积神经网络&#xff08;AlexNet&#xff09; 经典机器学习的流水线&#xff1a; ①获取一个有趣的数据集&#xff1b; ②根据光学、几何学&#xff0c;手动对特征数据集进行预处理&#xff1b; ③通过标准的特征提取算法&#xff0c;如SIFT&#xff08;尺度不变特征变…...

【wubuntu】披着Win11皮肤主题的Ubuntu系统

wubuntu - 一款外观类似于 Windows 的 Linux 操作系统&#xff0c;没有任何硬件限制。以下是官方的描述 Wubuntu is an operating system based on Ubuntu LTS that has a similar appearance to Windows using the open-source themes. Wubuntu also comes with a set of adva…...

Kubernetes自动化配置部署

在新建工程中&#xff0c;使用k8s的devops服务&#xff0c;自动化部署项目 1、在搭建好k8s的集群中&#xff0c;确认已开启devops服务&#xff1b; 2、新建Maven项目之后&#xff0c;创建dockerfile、deploy和Jenkins文件 例如&#xff1a; Dockerfile FROM bairong.k8s.m…...

2024年奥莱利科技趋势报告解析

2024年O’Reilly技术趋势报告解读 概述 在快速发展的技术领域&#xff0c;跟上最新趋势对行业内的任何人来说都至关重要。2024年O’Reilly技术趋势报告在此方面提供了关键的指导&#xff0c;全面概述了最重要的技术进步和模式。该年度报告基于O’Reilly著名在线学习平台280万…...

算法打卡Day14

今日任务&#xff1a; 1&#xff09;104.二叉树的最大深度 2&#xff09;559.n叉树的最大深度 3&#xff09;111.二叉树的最小深度 4&#xff09;222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#…...

Android Kotlin版封装EventBus

文章目录 Android Kotlin版封装EventBus代码封装添加依赖库定义消息类定义常量值定义注解定义工具类 使用在Activity中在Fragment中发送事件 源码下载 Android Kotlin版封装EventBus 代码封装 添加依赖库 implementation("org.greenrobot:eventbus:3.3.1")定义消息…...

VUE父子组件的传参问题

1.父组件向子组件传参 1&#xff09;这是一个父组件 //这是一个父组件 <div> <port :port-List"portList" ></port> </div> //port 这是子组件的名称export default{components: {},props: {},data() {return{portList:,}},computed: {}…...

四、C#希尔排序算法

简介 希尔排序简单的来说就是一种改进的插入排序算法&#xff0c;它通过将待排序的元素分成若干个子序列&#xff0c;然后对每个子序列进行插入排序&#xff0c;最终逐步缩小子序列的间隔&#xff0c;直到整个序列变得有序。希尔排序的主要思想是通过插入排序的优势&#xff0…...

华为认证网络工程师的市场需求大吗?

华为认证网络工程师的市场需求非常旺盛&#xff0c;这主要得益于信息技术的快速发展和网络建设的不断扩展。随着云计算、大数据、物联网等新兴技术的普及&#xff0c;企业对于数据通信和网络技术的需求日益增长&#xff0c;为网络工程师提供了广阔的就业空间。 从行业发展趋势来…...

Pytorch:nn.Upsample() 和nn.ConvTranspose2d()

nn.Upsample 原理 nn.Upsample 是一个在PyTorch中进行上采样&#xff08;增加数据维度&#xff09;的层&#xff0c;其通过指定的方法&#xff08;如nearest邻近插值或linear、bilinear、trilinear线性插值等&#xff09;来增大tensor的尺寸。这个层可以在二维或三维数据上按…...

百度交易中台之系统对账篇

作者 | 天空 导读 introduction 百度交易中台作为集团移动生态战略的基础设施&#xff0c;面向收银交易与清分结算场景&#xff0c;赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线&#xff0c;主要包括&#xff1a;度小店、小程序、地图打车、文心一言等。本文…...

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…...

JTAG接口原理与应用全解析

1. JTAG接口的前世今生第一次接触JTAG是在2005年调试一块ARM7开发板时。当时为了烧写程序&#xff0c;工程师递给我一条20针的排线&#xff0c;神秘地说&#xff1a;"这是JTAG调试口&#xff0c;小心别接反了。"那时的我完全没想到&#xff0c;这个看似普通的接口会成…...

加州大学洛杉矶分校、腾讯混元等推出Unify-Agent

这项由加州大学洛杉矶分校、腾讯混元、香港中文大学和香港科技大学联合研究团队发表于2026年3月的研究&#xff08;arXiv:2603.29620v1&#xff09;&#xff0c;彻底改变了我们对AI图像生成的认知。想象一下&#xff0c;如果你请AI画一个不太知名的动漫角色或者某个地方的特色小…...

计算机毕业设计:Python水网数据可视化与水位预测系统 Flask框架 数据分析 可视化 大数据 AI 线性回归 河流数据 水位预测(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

行式存储(Row-based Storage)和列式存储(Column-base Storage)简介饲

1. 哑铃图是什么&#xff1f; 哑铃图&#xff08;Dumbbell Plot&#xff09;&#xff0c;有时也称为DNA图或杠铃图&#xff0c;是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中&#xff0c;我们通常使用两条折…...

OpenClaw+千问3.5-9B智能监控:服务器日志异常自动告警

OpenClaw千问3.5-9B智能监控&#xff1a;服务器日志异常自动告警 1. 为什么需要智能日志监控&#xff1f; 去年我负责维护的一个内部项目突然在凌晨崩溃&#xff0c;直到第二天上班才发现。查看日志才发现&#xff0c;其实系统在崩溃前2小时就已经开始报错——如果能实时捕获…...

电脑无法升级Windows 11?ChromeOS Flex是个不错的替代方案

谷歌再次提醒用户&#xff1a;即便你使用的是PC&#xff0c;也不必被微软的操作系统所束缚。事实上&#xff0c;这家科技巨头正在让用户切换到ChromeOS Flex变得前所未有的简单。谷歌近期与二手电子产品公司Back Market达成新合作&#xff0c;现已推出ChromeOS Flex USB安装套件…...

如何用Awoo Installer实现Switch全格式游戏安装的无缝体验

如何用Awoo Installer实现Switch全格式游戏安装的无缝体验 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 对于Nintendo Switch玩家而言&#xff0…...

**标题:MLOps实战进阶:用Python+Docker+Kubernetes打造自动化模型部署流水

标题&#xff1a;MLOps实战进阶&#xff1a;用PythonDockerKubernetes打造自动化模型部署流水线 在现代机器学习工程中&#xff0c;模型从实验到上线的全流程自动化已成为企业级落地的关键瓶颈。传统手动部署模式不仅效率低下&#xff0c;还容易因环境差异导致“在我电脑上能跑…...

IC670GBI002总线接口单元

IC670GBI002 总线接口单元 (BIU) 产品特点该总线接口单元是工业自动化系统中实现模块间高速、可靠数据通信的关键组件&#xff0c;保证控制系统稳定、高效运行。提供高速可靠的总线通信接口支持多模块数据交换&#xff0c;实现系统扩展数据传输稳定&#xff0c;确保控制精度响应…...

从CPU缓存到C#代码:图解volatile如何解决可见性问题

从CPU缓存到C#代码&#xff1a;图解volatile如何解决可见性问题 当你在调试一个多线程程序时&#xff0c;是否遇到过这样的困惑&#xff1a;明明某个变量已经被修改了&#xff0c;但其他线程却"视而不见"&#xff1f;这种看似灵异的现象背后&#xff0c;隐藏着现代计…...