【力扣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 0
    sort_nums=nums.sort(function(a,b){return a-b})
    let i = 0
    let arr_length=1
    let 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=1
            i++
        }
    }
    final_length.sort(function (a, b) {
    return a - b
    })
    let result = final_length
    return result[result.length-1]
};

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

/**
 * @param {number[]} nums
 * @return {number}
 */
var longestConsecutive = function(nums) {
    if(nums.length===0) return 0
    sort_nums=nums.sort((a, b) => a - b )
    let i = 0
    let arr_length=1
    let 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_length
    return 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 0
  nums.sort((a, b) => a - b)
  let max = 1
  let count = 1
  for (let i = 0; i < nums.length - 1; i++) {
    let cur = i, next = i + 1
    if (nums[cur] === nums[next]) continue // 相同就跳过本次循环
    if (nums[cur] + 1 === nums[next]) { // 发现连续项 count++
      count++
    } else { // 否则,count重置1
      count = 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 = 0
  for (let i = 0; i < nums.length; i++) {
    if (!set.has(nums[i] - 1)) { // nums[i]没有左邻居,是序列的起点
      let cur = nums[i]
      let count = 1
      while (set.has(cur + 1)) { // cur有右邻居cur+1
        cur++ // 更新cur
        count++ 
      }
      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 = 0
  for (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) // 将自己存入 map
      max = Math.max(max, curLen) // 和 max 比较,试图刷新max
      map.set(num - preLen, curLen)  // 更新新序列的左端数字的value
      map.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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运维】MacOS Wifi热点设置

目录 打开热点 配置共享网段 打开热点 打开macOS设置&#xff0c;进入通用->共享 点击如下图标进行配置&#xff0c; 会进入如下界面&#xff08;⚠️目前是打开共享状态&#xff0c;无法修改配置&#xff0c;只有在未打开状态才能进入配置&#xff09; 配置完成后&#x…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上&#xff0c;客户端在请求图片资源时&#xff0c;当服务端架设了多个节点的情况下&#xff0c;由于没有负载均衡请求到保存图片资源的服务器&#xff0c;出现图片访问404的问题。 这里保存上传文件时&#xff0c;同时需要将该文件保…

PTA题解 --- 阶梯电价(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解A-B&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 要解决这个问题&#xff0c;我们可以编写一个C语言程序&#xff0c;首先判断输入的月用电量是否有效&#xff08;即大于等于0&#xff09;。如果有效&…

java设计模式(1)---总则

设计模式总则 一、概述 1、什么是设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 解释下&#xff1a; 分类编目&#xff1a;就是说可以找到一些特征去划分这些设计模式&#xff0c;从而进行分类。 代码设计经验&#xff1a;这句很重…

大屏可视化综合展示解决方案

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

HAL STM32G4 +TIM1 3路PWM互补输出+VOFA波形演示

HAL STM32G4 TIM1 3路PWM互补输出VOFA波形演示 ✨最近学习研究无刷电机驱动&#xff0c;虽然之前有使用过&#xff0c;但是在STM32上还没实现过。本文内容参考欧拉电子例程&#xff0c;从PWM驱动开始学习。 欧拉电子相关视频讲解&#xff1a; STM32G4 FOC开发实战—高级定时器发…

一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

在当前的数字化世界中&#xff0c;自动化已经成为我们日常生活和工作中的关键部分。它不仅提高了效率&#xff0c;还节省了大量的时间和精力。在这篇文章中&#xff0c;我们将探讨如何使用Python来实现一个特定的自动化任务 - PC屏幕截图自动发送到指定的邮箱。 这个任务可能看…

抢滩中东商机!2024年现在入局是否还为时不晚?

有人说&#xff0c;在2024年&#xff0c;做外贸工厂跨境电商的老板&#xff0c;想要翻身&#xff0c;甚至想改变命运&#xff0c;有两个路径&#xff0c;其中一个路径就是&#xff1a;做沙特电商。 入局中东电商好时机 经商环境好&#xff1a;欧美市场竞争激烈&#xff0c;进入…

第十四届蓝桥杯大赛软件赛省赛Java大学B组

最近正在备考蓝桥杯&#xff0c;报的java b组&#xff0c;顺便更一下蓝桥的 幸运数字 题目 思路&#xff1a;填空题&#xff0c;暴力即可 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {static int trans(int x, int y){int …

【目标检测基础篇】目标检测评价指标:mAP计算的超详细举例分析以及coco数据集标准详解(AP/AP50/APsmall.....))

学习视频&#xff1a; 霹雳吧啦Wz-目标检测mAP计算以及coco评价标准 【目标检测】指标介绍&#xff1a;mAP 1 TP/FP/FN TP(True Positive) : IoU>0.5的检测框数量(同一Ground truth只计算一次)FP(False Positive) : IoU<0.5的检测框(或者是检测到同一个GT的多余检测框的…

nacos 更新报错“发布失败。请检查参数是否正确”

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因解决方案结果 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…

FL Studio2024全能数字编曲音频工作站,打造专业电音的不二之选!

FL Studio2024全能数字编曲音频工作站&#xff0c;打造专业电音的不二之选&#xff01; 专业机构力荐&#xff0c;让你的音乐创作如虎添翼 在音乐的世界里&#xff0c;没有什么比创作出属于自己的独特旋律更令人兴奋的了。 而今天&#xff0c;我们为你带来了一款能够让音乐制作…

Hive SQL必刷练习题:排列组合问题【通过join不等式】

排列组合问题【通过join不等式】 这种问题&#xff0c;就是数学的排列不等式&#xff0c;一个队伍只能和其余队伍比一次&#xff0c;不能重复 方法1&#xff1a;可以直接通过join&#xff0c;最后on是一个不等式【排列组合问题的解决方式】 方法2&#xff1a;也可以是提前多加…

PDF文件如何以数字进行批量重命名?以数字重命名的PDF文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件&#xff0c;如文档、报告、合同等。为了更高效地管理这些文件&#xff0c;一个有效的方式就是对它们进行批量命名。批量命名不仅能提高文件的组织性&#xff0c;还能节省大量时间。下面&#xff0c;我们将详细介绍…

springboot实现文件上传

SpringBoot默认静态资源访问方式 首先想到的就是可以通过SpringBoot通常访问静态资源的方式&#xff0c;当访问&#xff1a;项目根路径 / 静态文件名时&#xff0c;SpringBoot会依次去类路径下的四个静态资源目录下查找&#xff08;默认配置&#xff09;。 在资源文件resour…

关于调度算法,小林给出更好的例子(银行办理业务)

看的迷迷糊糊&#xff1f;那我拿去银行办业务的例子&#xff0c;把上面的调度算法串起来&#xff0c;你还不懂&#xff0c;你锤我&#xff01; 办理业务的客户相当于进程&#xff0c;银行窗口工作人员相当于 CPU。 现在&#xff0c;假设这个银行只有一个窗口&#xff08;单核 …

个人家庭安装光伏流程及注意事项

今年《政府工作报告》提出&#xff0c;推动分布式能源开发利用。这是“分布式能源”首次被写入《政府工作报告》。从地方层面来看&#xff0c;“分布式能源”也被多个地方列入今年的政府工作重点&#xff0c;可见光伏发展依旧强势。 光伏安装流程大概分为以下几步&#xff1a; …

【数据分析案列】--- 北京某平台二手房可视化数据分析

一、引言 本案列基于北京某平台的二手房数据&#xff0c;通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼&#xff08;至关重要&#xff09;&#xff0c;对房屋价格、面积、有无电梯等因素的可视化展示&#xff0c;我们可以深入了解北京二手房市场的特点…

校招免费资料大集合

通过以下资料&#xff0c;你可以免费获取到大量的校招资料和相关信息&#xff0c;帮助你更好地准备校园招聘。 学习交流群&#xff1a;进行计算机知识分享和交流&#xff0c;提供内推机会&#xff0c;QQ群号&#xff1a;325280438 夏沫Coding&#xff1a;致力于分享计算机干货…

机器学习聚类分析算法之均值漂移算法

简介 均值漂移算法(Mean Shift Algorithm)是一种非参数化的聚类算法,常用于图像分割、目标跟踪和密度估计等任务。该算法基于密度估计的原理,通过不断地迭代更新数据点的位置,使得数据点向密度较高的区域移动,最终聚集成簇。均值漂移算法的核心思想是在数据点的特征空间…