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

LC 128.最长连续序列

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 ≤ n u m s . l e n g t h ≤ 1 0 5 0 \leq nums.length \leq 10^5 0nums.length105
  • − 10 9 ≤ n u m s [ i ] ≤ 1 0 9 {-10}^9 \leq nums[i] \leq 10^9 109nums[i]109

解法一(排序)

思路分析:

  1. 题目要求:找出数字连续的最长序列,且不需要在原数组中连续,则可以尝试对原数组进行排序;
  2. 排序之后,在遍历数组,判断 相邻元素是否连续, 若连续则计数长度+1, 若不连续则将计数长度归1,重新开始计数;
  3. 因为序列长度,需要算上第一个元素,即 只有一个元素时, 序列长度为1, 所以初始序列长度为 1;
  4. 同时需要注意: 题目并未说明数组中的元素不重复, 所以需要排除重复元素的情况

实现代码如下:

class Solution {public int longestConsecutive(int[] nums) {int n = nums.length;if (n == 0) {return 0;}// 排序Arrays.sort(nums);// 最小连续序列长度为 1int max = 1;int flag = 1;for (int i = 0; i < n-1; ++ i) {if (nums[i] == nums[i+1] - 1) {// 若连续 则长度增加flag ++;} else if (nums[i] == nums[i+1]) {// 排除连续相等的元素continue;}else {// 不连续 则重新计数flag = 1;}// 时刻更新最长序列max = Math.max(flag, max);}return max;}
}

提交结果如下:

解答成功:

执行耗时:12 ms,击败了98.27% 的Java用户

内存消耗:55.3 MB,击败了95.98% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n × l o g n ) O(n \times log n) O(n×logn), 对数组排序的复杂度;
  • 空间复杂度: O ( 1 ) O(1) O(1)

解法二(哈希表)

思路分析:

  1. 对数组中的每个数进行枚举, 然后再在数组中寻找x+1, x+2, x+3, …, 当匹配到x+y,即此时序列长度为y+1
  2. 但是每次遍历匹配的时间复杂度为 O ( n ) O(n) O(n),涉及到匹配的优化可以考虑使用哈希表来减少匹配的复杂度;即查看一个数是否存在的时间复杂度可以优化为 O ( 1 ) O(1) O(1)
  3. 所以只需要遍历数组元素,然后以每个元素为起点x,持续判断x+?是否存在,即可得到以x为起点的序列长度;
  4. 但是此时的时间复杂度依然为 O ( n 2 ) O(n^2) O(n2),每个元素可能会重复遍历多次, 比如序列[100,4,200,1,3,2]中,以2为起点和以1为起点都会导致重复遍历;
  5. 最优情况是: 只从每个序列的起点开始遍历获取序列长度,例如序列[100],序列长度为1,起点为100, 序列[1,2,3,4],只从起点1遍历一次,而不会再去从2开始遍历[2,3,4];
  6. 所以可以在遍历数组元素时,判断当前元素是否为序列的起点,若为序列起点,则开始匹配序列,并获取序列长度,若不是序列起点,则跳过;
  7. 判断一个元素x是否为序列起点, 可以判断哈希表中是否存在元素x-1,若存在,则说明序列可以从x-1开始,即x不是序列起点; 若不存在,则说明x为序列起点
  8. 同时,需要考虑数组元素的重复情况,以及哈希表的选取,因为不需要绑定数组元素的索引,即不需要使用Map来作为哈希表; 即使用Set作为哈希表即可,同时可以起到去重的作用;

实现代码如下:

class Solution {public int longestConsecutive(int[] nums) {// 定义哈希表Set<Integer> set = new HashSet<>();// 遍历数组 并存入哈希表中去重for (int num : nums) {set.add(num);}// 最长序列长度int maxLen = 0;for (Integer num : set) {// 判断当前元素是否为序列起点if (!set.contains(num-1)) {// 为序列起点 遍历序列获取长度// 当前元素int currentNum = num;// 当前序列长度int currentLen = 1;while (set.contains(currentNum + 1)) {// 序列长度增加++ currentLen;++ currentNum;}maxLen = Math.max(maxLen, currentLen);}}return maxLen;}
}

提交结果如下:

解答成功:
执行耗时:27 ms,击败了59.27% 的Java用户
内存消耗:66.1 MB,击败了6.98% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),只需 O ( n ) O(n) O(n)的遍历数组元素;
  • 空间复杂度: O ( n ) O(n) O(n),需要使用哈希表来存储数组元素;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【计算机网络】数据链路层实验
  • Redis-高级实战案例
  • 基于 HTML+ECharts 实现智慧交通数据可视化大屏(含源码)
  • 老司机通过一张图片就能看懂HTTP和HTTPS的区别
  • 掌握 Symfony 路由系统:配置与管理
  • 【Django】ajax和django接口交互(获取新密码)
  • 揭秘PLC工业网关:连接工业自动化的枢纽
  • java使用hutool工具判断ip或者域名是否可用,java使用ping判断ip或者域名是否可用
  • 汕头 西月 公司的面试
  • Unity中实现动画效果的几种方式
  • 云 IDE 你了解多少
  • 《MySQL DBA 修炼之道》第四章 开发进阶
  • Profinet转ModbusTCP网关模块的配置与应用详解
  • 泰山派RK3566开发板800x1280MIPI屏设备树补丁
  • 是挤牙膏还是深藏不露?要不要升级Apple macOS Sequoia?
  • eclipse(luna)创建web工程
  • es6(二):字符串的扩展
  • ES6简单总结(搭配简单的讲解和小案例)
  • FastReport在线报表设计器工作原理
  • java取消线程实例
  • Redis 懒删除(lazy free)简史
  • TCP拥塞控制
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 高性能JavaScript阅读简记(三)
  • 工程优化暨babel升级小记
  • 简单易用的leetcode开发测试工具(npm)
  • 将 Measurements 和 Units 应用到物理学
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 区块链将重新定义世界
  • 为什么要用IPython/Jupyter?
  • 用Canvas画一棵二叉树
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • MyCAT水平分库
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​渐进式Web应用PWA的未来
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 数据结构
  • #include
  • (2)STM32单片机上位机
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (poj1.2.1)1970(筛选法模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (八十八)VFL语言初步 - 实现布局
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二开)Flink 修改源码拓展 SQL 语法
  • (翻译)terry crowley: 写给程序员
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (幽默漫画)有个程序员老公,是怎样的体验?