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

LeetCode128. 最长连续序列

LeetCode128. 最长连续序列

  • 1. 题目链接
  • 2. 问题分析
  • 3. 解法一:排序法(虽然不符合要求但很直观)
  • 4. 解法二:哈希集合法(符合 O(n) 要求)

1. 题目链接

LeetCode128. 最长连续序列

2. 问题分析

这道题要求找到最长的连续数字序列,这个序列在原数组中不要求元素位置连续,只要数值连续即可。初看之下,似乎很简单——只需要排序后遍历一遍就能找到答案。但题目要求时间复杂度为 O(n),这就排除了基于排序的解法(排序通常为 O(n log n))。

我们需要一种更巧妙的方法,能够在 O(1) 时间内判断某个数字是否存在,这就是哈希表大显身手的地方。

3. 解法一:排序法(虽然不符合要求但很直观)

先来看看最直观的解法,虽然它不符合题目要求,但能帮助我们理解问题:

public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;// 先排序 - O(n log n)Arrays.sort(nums);int maxLength = 1;int currentLength = 1;for (int i = 1; i < nums.length; i++) {// 跳过重复元素if (nums[i] == nums[i-1]) continue;// 判断是否连续if (nums[i] == nums[i-1] + 1) {currentLength++;maxLength = Math.max(maxLength, currentLength);} else {currentLength = 1;}}return maxLength;
}

这种解法的时间复杂度是 O(n log n),空间复杂度是 O(1)(如果不考虑排序的空间开销)。

4. 解法二:哈希集合法(符合 O(n) 要求)

核心思路:

  1. 使用哈希集合存储所有数字,实现 O(1) 时间的查找
  2. 对于每个数字 x,如果 x-1 不存在,说明 x 可能是一个连续序列的起点
  3. 从这些起点开始,不断查找下一个数字,直到连续性破坏
  4. 记录过程中找到的最长序列

为什么可以跳过某些数字?

如果一个数字 x 的前驱 x-1 存在,那么 x 肯定不是某个连续序列的起点,从 x 开始找肯定不会得到最长序列,所以直接跳过。

算法步骤

  1. 创建哈希集合,存入所有数字
  2. 遍历数组中的每个数字 x:
    1. 如果 x-1 不在集合中(说明是起点)
    2. 从 x 开始,尝试找 x+1, x+2, … 直到找不到为止
    3. 更新最长序列的长度
  3. 返回最长长度
public int longestConsecutive(int[] nums) {// 创建哈希集合,存入所有数字Set<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int maxLength = 0;// 遍历每个数字for (int num : nums) {// 如果num-1存在,说明num不是序列的起点,跳过if (!set.contains(num - 1)) {int currentNum = num;int currentLength = 1;// 不断查找下一个数字while (set.contains(currentNum + 1)) {currentNum++;currentLength++;}maxLength = Math.max(maxLength, currentLength);}}return maxLength;
}

时间复杂度分析

  1. 构建哈希集合:O(n)
  2. 外层循环:O(n)
  3. 内层循环:每个数字最多进入内层循环一次(因为只有起点才会进入内层)
  4. 总时间复杂度:O(n),符合要求
http://www.dtcms.com/a/531737.html

相关文章:

  • go-stream(一些常用命令介绍,以及在go-tcp中使用)
  • 中职 网站建设与管理海口快速建站公司推荐
  • Qt TCP 网络通信详解(笔记)
  • RandLA-net-pytorch 复现
  • Rocky 9 安装 Elasticsearch分布式集群基于非安全特性
  • 使用现代C++构建高效日志系统的分步指南
  • Nacos 环境搭建:从单机开发到集群生产部署
  • OpenWrt | 实现限制只有指定设备才能访问 luci 和 使用 SSH 等方式管理设备的方法
  • 数据库圣经-----最终章JDBC
  • 小贷做网站客户推广渠道有哪些
  • SAP SD交货单明细查询接口分享
  • Java Spring原理 --- Bean的作用域,Bean的生命周期,Spring自动配置
  • TCP三次握手与四次挥手通俗理解
  • 电商网站如何设计内容能源产品网站建设多少钱
  • 门户网站的发布特点网站子栏目设计
  • 赣州企业网站建设公司苏州网站定制公司哪家好
  • 网页设计与网站建设的课后习题答案外贸 企业网站 建设
  • 呼伦贝尔网站建设平台海口网站运营托管费用
  • 网站外包费用怎么做分录个人做广播网站需要注意什么
  • 教育网站设计欣赏建一个公司网站要多少钱
  • 广州快速建站公司推荐做关于植物的网站
  • 厦门网站建设哪家专业黔东南小程序开发公司
  • 网站开发公司安心加盟苏州排名搜索优化
  • 响应式网站公司怎么做网站
  • 老师问我做网站用到什么创新技术江苏网站建设空间
  • wordpress 菜单没了网站关键词排名seo
  • 立网站系网站开发用什么工具好
  • html 网站开发软件网站永久免费建站
  • 万网网站开发世界500强企业中国有哪些
  • 漳州招商局规划建设局网站饿了么网站做生鲜吗