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

力扣 128. 最长连续序列

题目描述

在这里插入图片描述

我的思路

我的思路比较暴力,就是首先将数组从小到大进行排序,然后再依次遍历判断序列是否连续并时时更新连续序列的最长长度。比如示例1:nums = [100, 4, 200, 1, 3, 2],第一步先将数组进行排序得到sort_nums = [1, 2, 3, 4, 100, 200];第二步遍历的时候其实不用每个数都遍历,比如遍历1的时候发现1和后面的2,3,4是连续的,那么后续2,3,4就不用再遍历了,直接从100开始遍历;每遍历一个元素时记录以该元素开头的连续序列长度,实时更新前面所有连续序列的最长长度;最后输出最长长度。

这个思路是可以解决问题的,但是时间复杂度明显不符合题目要求,首先看排序的时间复杂度就超过O(n)了,后续遍历的时间复杂度为O(n^2),算法仍需进一步优化。

官方题解:哈希表

看了官方题解的哈希表解法,再对照我自己的暴力搜索思路,发现了2个关键的改进点。

1、利用哈希表搜索高效的优势,替代数组元素遍历(因为本质上是判断特定元素是否存在的问题)。

2、利用连续序列的性质来减少重复搜索的次数,比如发现从1开始的1,2,3,4的连续序列后,再看从2开始的连续序列时就可以直接跳过了,因为2的前一数1存在,因此以1开头的连续序列肯定比2开头的连续序列长。

经过这两点的优化,算法的复杂度就是搜索哈希表的复杂度,即O(n)。

该思路的代码如下

class Solution:def longestConsecutive(self, nums: List[int]) -> int:longest_streak = 0num_set = set(nums) # 转成集合,只留唯一元素即可for num in num_set:if num - 1 not in num_set: # 如果前一个元素并不存在,则作为序列的起始元素进行连续序列长度的计数current_num = numcurrent_streak = 1 while current_num + 1 in num_set: # 若下一个数字存在则连续序列长度进行更新current_num += 1current_streak += 1longest_streak = max(longest_streak, current_streak)return longest_streak

参考

力扣官方题解: 最长连续序列

http://www.lryc.cn/news/430529.html

相关文章:

  • Stable Diffusion AI绘画工具的安装与配置(MAC用户)
  • flowable源码解读——并行多实例节点任务是否是顺序生成
  • 【机器学习】AGI的基本概念、技术挑战和应用前景
  • flink 使用RocksDB作为状态后端
  • 【运维高级内容--MySQL】
  • 【仿真与实物设计】基于51单片机设计的打地鼠游戏机——程序源码原理图proteus仿真图PCB设计文档演示视频元件清单等(文末工程资料下载)
  • iPhone设备使用技巧:忘记密码的情况下如何解除iOS 18/17屏幕时间
  • 内网渗透的风行者—Yasso
  • Android13 app后台无法启动Abort background activity starts from
  • Day45 | 99.岛屿数量 深搜 广搜 100.岛屿的最大面积
  • css之grid布局(网格布局)
  • 数据可视化大屏模板-美化图表
  • 【与C++的邂逅】--- 类和对象(中)
  • [数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别
  • Day42 | 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
  • 运维大规模K8S集群注意事项
  • 供应链系统源码的关键技术是什么?
  • git 修改远程仓库的 URL
  • 使用图数据库 Neo4j 处理对象之间的关系
  • 使用C#的异步和依赖注入实现网络数据存储
  • tomcat日志文件切割
  • Python将Word文档转为PDF
  • 深入浅出链表
  • Linux核心命令入门
  • 腾讯无界微前端框架介绍
  • Linux——网络(2)
  • 结合量子技术解决数据传输安全
  • 【Rust光年纪】提高开发效率:深入了解Rust语言中的数据库客户端和文件处理库
  • 【自动驾驶】控制算法(一)绪论与前期准备
  • CSDN创作一周年总结