LeetCode 128. 最长连续序列 ⭐️

embedded/2024/9/24 8:20:44/

题目描述

给定一个未排序的整数数组 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

(排序+去重+快慢指针方法,leetcode可以过,但是时间复杂度不是 O(n)

一开始看到题目,肯定想到是先排序,然后使用快慢指针方法进行解决

排序后变成 【1,2,3,4,100,200】,然后慢指针指向连续序列的开头,快指针指向连续序列的结尾

当nums[i]!=nums[i-1]+1时,说明已经断开了,已经到达当前最大连续序列,计算max与当前最值中的最大者即可然后依次循环

还需要注意一种场景,排序后是0--1--1--2,这种有重复元素的需要去重后才能使用

代码1

class Solution {public int longestConsecutive(int[] nums) {//特殊场景if(nums==null||nums.length==0){return 0;}//循环从1开始,排除只有一个元素情况if(nums.length==1){return 1;}//排序Arrays.sort(nums);//去重nums = Arrays.stream(nums).distinct().toArray();//最大长度int maxLen=0;//当前序列长度int curLen=1;for(int i=1;i<nums.length;i++){//相邻两个数相差1,说明是连着的数,当前序列长度+1if(nums[i]==nums[i-1]+1){curLen++;}else{//不满足相差1 说明不是连着的数,就计算最大长度,然后将当前序列长度恢复成1maxLen= Math.max(maxLen,curLen);curLen=1;}}//最终要返回当前序列长度与maxLen的最大值return Math.max(maxLen,curLen);}
}

思路2

1、先把所有元素放入set中,去重

2、循环数组,当前元素的前一个数,

如果不在set中,那么就当该数是连续序列开头的元素,循环判断num[i]+1是否在数组中,存在就序列次数也增加。

如果在set中,说明当前元素不是连续序列的开头元素。

例如4--1--3--2,

4的前一个元素3在set中,4不是序列开头元素,所以直接跳过。

然后是1,1-1=0,0不在set中,那么把1当做是序列开头元素,接下来判断1+1=2,然后判断1+1=2在序列中,长度变2,然后2+1=3在序列中,长度变3,然后是3+1=4在set中,长度变4,然后4+1=5,不在序列中结束,此时连续的序列是1--2--3--4,最大长度4

代码2

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();//添加到set中for(int num : nums){set.add(num);}int maxLen = 0;for(Integer num : set){//num-1不在set中,说明num是序列第一个元素if(!set.contains(num-1)){//当前序列长度int currentLen = 1;//当前值int cur=num;//当当前元素+1在set中while(set.contains(num+1)){//当前序列长度+1currentLen++;//当前值加1num=num+1;}//取最大值maxLen = Math.max(maxLen,currentLen);}}return maxLen;}
}

leetcode中示例代码是将while(set.contains(num+1))改写成while(set.contains(++num)),时间就快了很多,所以可以进行这样的优化,下边num也不需要再+1

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();//添加到set中for(int num : nums){set.add(num);}int maxLen = 0;for(Integer num : set){//num-1不在set中,说明num是序列第一个元素if(!set.contains(num-1)){//当前序列长度int currentLen = 1;//当前值int cur=num;//当当前元素+1在set中while(set.contains(++num)){//当前序列长度+1currentLen++;}//取最大值maxLen = Math.max(maxLen,currentLen);}}return maxLen;}
}


http://www.ppmy.cn/embedded/101019.html

相关文章

SmartGit-Git版本控制系统的图形化客户端

SmartGit&#xff1a; SmartGit是一款免费的、专业的Git版本控制系统的图形化客户端。它适用于Windows、Mac和Linux等多种操作系统&#xff0c;提供了直观的用户界面和丰富的功能。支持创建、克隆、推送、拉取、合并和管理Git仓库&#xff0c;以及强大的分支管理功能。还提供了…

“计算机专业 一定要优先报网络安全它是未来国家发展的大方向”

前言 “计算机专业 一定要优先报 网络安全 它是未来国家发展的大方向” 为什么推荐学网络安全&#xff1f; “没有网络安全就没有国家安全。”当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 01 高需求和就…

爆改YOLOv8 | 利用CPA-Enhancer提高低照度物体检测(适用于雨,雪,雾天)

1&#xff0c;本文介绍 CPA-Enhancer通过链式思考提示机制实现了对未知退化条件下图像的自适应增强&#xff0c;显著提升了物体检测性能。其插件式设计便于集成到现有检测框架中&#xff0c;并在物体检测及其他视觉任务中设立了新的性能标准&#xff0c;展现了广泛的应用潜力。…

RPA自动化流程机器人助力企业财务数字化转型

在数字经济时代&#xff0c;企业需要快速响应市场变化&#xff0c;而财务数字化转型是企业适应现代商业环境、提升竞争力的必要步骤。财务数字化转型不仅涉及企业财务能力的提升&#xff0c;推动了财务管理与决策模式的转变。RPA自动化流程机器人因其能通过自动化技术帮助企业实…

Python——集合基本操作以及哈希函数

Python 中的集合&#xff08;Set&#xff09;是一个无序的、不包含重复元素的数据结构。集合主要用于数学上的集合操作&#xff0c;如并集、交集、差集和对称差集等。集合使用大括号 {} 来表示&#xff0c;但注意空集合不能使用 {} 表示&#xff08;这会创建一个空字典&#xf…

深度剖析数字媒体产业链的无限潜力与创新生态

在当今信息爆炸的时代&#xff0c;数字媒体产业链正以势不可挡的姿态展现出其令人瞩目的无限潜力与创新生态。 数字媒体的发展潜力简直无可限量。从在线视频的爆发式增长&#xff0c;到虚拟现实和增强现实技术带来的沉浸式体验&#xff0c;再到社交媒体平台上丰富多彩的内容创…

uniapp实现区域滚动、下拉刷新、上滑滚动加载更多

背景&#xff1a; 在uniapp框架中&#xff0c;有两种实现办法。第1种&#xff0c;是首先在page.json中配置页面&#xff0c;然后使用页面的生命周期函数&#xff1b;第2种&#xff0c;使用<scroll-view>组件&#xff0c;然后配置组件的相关参数&#xff0c;包括但不限于&…

C++ 设计模式——享元模式

C 设计模式——享元模式 C 设计模式——享元模式1. 主要组成成分2. 享元模式内部状态3. 享元模式外部状态4. 逐步构建享元模式4.1 抽象享元类定义4.2 具体享元类实现4.3 享元工厂类实现4.4 主函数 5. 享元模式 UML 图享元模式 UML 图解析 6. 享元模式的优点7. 享元模式的缺点8.…