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

力扣100题之128. 最长连续序列

方法1 使用了hash

方法思路
使用哈希集合:首先将数组中的所有数字存入一个哈希集合中,这样可以在 O(1) 时间内检查某个数字是否存在。
寻找连续序列:遍历数组中的每一个数字,对于每一个数字,
检查它是否是某个连续序列的起点(即检查 num - 1 是否存在于集合中)。
如果不是起点,则跳过;
如果是起点,则开始向后检查连续的数字(num + 1, num + 2 等),并记录序列的长度。
更新最大长度:在遍历过程中,不断更新记录的最大序列长度。
这种方法确保每个数字最多被访问两次(一次在遍历数组时,一次在检查连续序列时),因此时间复杂度为 O(n)。

    public int longestConsecutive(int[] nums) {/*  方法思路使用哈希集合:首先将数组中的所有数字存入一个哈希集合中,这样可以在 O(1) 时间内检查某个数字是否存在。寻找连续序列:遍历数组中的每一个数字,对于每一个数字,检查它是否是某个连续序列的起点(即检查 num - 1 是否存在于集合中)。如果不是起点,则跳过;如果是起点,则开始向后检查连续的数字(num + 1, num + 2 等),并记录序列的长度。更新最大长度:在遍历过程中,不断更新记录的最大序列长度。这种方法确保每个数字最多被访问两次(一次在遍历数组时,一次在检查连续序列时),因此时间复杂度为 O(n)。*///        1.哈希集合初始化:将数组中的所有数字存入哈希集合 numSet 中,以便快速查找。Set<Integer> hashSet = new HashSet<>;for(int num:nums){hashSet.add(num);}int longesetStreak = 0;
//        2.遍历集合:对于集合中的每一个数字,检查它是否是某个连续序列的起点(即 num - 1 不在集合中)。for(int num:hashSet){//        3.扩展序列:如果是起点,则向后扩展序列,计算当前连续序列的长度 currentStreak。if(!hashSet.contains(num-1)){int currentNum =num;int currentStreak=1;while(hashSet.contains(currentNum+1)){currentNum++;currentStreak++;}//        4.更新最大值:比较并更新最长序列长度 longestStreak。longesetStreak=Math.max(longesetStreak,currentStreak);}}//        5.返回结果:最终返回最长序列的长度。return longesetStreak;}

方法二 排序法(时间复杂度大)

public int longestConsecutive(int[] nums) {// 处理边界情况:空数组直接返回0if (nums.length == 0) return 0;// 对数组排序(升序),便于后续连续元素判断Arrays.sort(nums);int maxLength = 0;  // 记录最长连续子序列长度int currentLength = 1;  // 当前连续子序列长度,初始为1(至少有一个元素)// 从第二个元素开始遍历(索引1到末尾)for (int i = 1; i < nums.length; i++) {int currentNum = nums[i];int prevNum = nums[i - 1];if (currentNum == prevNum) {// 跳过重复元素(排序后相邻重复,不影响连续性判断)continue;} else if (currentNum == prevNum + 1) {// 当前元素与前一个元素连续,长度加1currentLength++;} else {// 连续序列中断,更新最长长度,并重置当前长度maxLength = Math.max(maxLength, currentLength);currentLength = 1;}}// 处理最后一次连续序列(遍历结束后可能还有未比较的长度)return Math.max(maxLength, currentLength);
}

在这里插入图片描述

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

相关文章:

  • 算法打卡12天
  • OpenCV C++ 学习笔记(四):图像/视频的输入输出(highgui模块 高层GUI和媒体I/O)
  • 我的创作纪念日——聊聊我想成为一个创作者的动机
  • 蓝桥杯国赛训练 day1 Java大学B组
  • PyTorch——非线性激活(5)
  • OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG
  • MATLAB读取文件内容:Excel、CSV和TXT文件解析
  • Spring MVC 之 异常处理
  • 缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”
  • ubuntu24.04 使用apt指令只下载不安装软件
  • macOS 上使用 Homebrew 安装redis-cli
  • 计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!
  • WinCC学习系列-高阶应用(WinCC REST通信)
  • 八、Python模块、包
  • 使用交叉编译工具提示stubs-32.h:7:11: fatal error: gnu/stubs-soft.h: 没有那个文件或目录的解决办法
  • macOS 连接 Docker 运行 postgres,使用navicat添加并关联数据库
  • 指针的使用——基本数据类型、数组、结构体
  • TK海外抢单源码/指定卡单
  • Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法
  • 【Linux】Linux 环境变量
  • OpenCV在图像上绘制文字示例
  • Java 抗量子算法:构建后量子时代的安全基石
  • Kubernetes 集群到 Jumpserver
  • Android7 Input(十)View 处理Input事件pipeline
  • 图像数据如何表示为概率单纯形
  • (11)Service Mesh架构下Java应用实现零信任安全模型
  • 什么是内网映射?如何将内网ip映射到外网访问?
  • 为什么要选择VR看房?VR看房有什么优点?
  • linux 串口调试命令 stty
  • C++STL-vector的使用