2026/5/21 15:42:51
网站建设
项目流程
谁会网站开发,网站建设专业的有哪些,小网站推荐,重庆网站推广报价在 LeetCode 的算法题中#xff0c;“最长连续序列” (Longest Consecutive Sequence) 是一道非常经典的 Hot 100 题目。它考察的不是复杂的算法模板#xff0c;而是对哈希表特性的灵活运用以及对时间复杂度的精确控制。
1. 题目核心难点
题目描述#xff1a;给定一个未排…在 LeetCode 的算法题中“最长连续序列” (Longest Consecutive Sequence)是一道非常经典的Hot 100题目。它考察的不是复杂的算法模板而是对哈希表特性的灵活运用以及对时间复杂度的精确控制。1. 题目核心难点题目描述给定一个未排序的整数数组nums找出数字连续的最长序列不要求序列元素在原数组中连续的长度。关键限制请你设计并实现时间复杂度为的算法解决此问题。为什么不能排序看到“连续序列”直觉反应通常是先排序然后遍历一遍统计。排序算法如快速排序、归并排序的时间复杂度下限是。题目严格要求这意味着排序是被禁止的。我们必须在不排序的情况下通过“查找”来还原序列。2. 核心思路哈希表 “跳过逻辑”要在时间内知道“某个数字是否存在”只能依靠哈希表 (HashSet)。步骤一去重与快速查找首先将数组中所有元素放入HashSet中。目的 1实现的查找复杂度。目的 2去重虽然这一步不是必须的但遍历 Set 比遍历原数组更稳健详见后文分析。步骤二寻找序列的“起点” (关键优化)这是算法能达到的核心原因。假设数组是 [100, 4, 200, 1, 3, 2]。哈希表中包含了这些数字。当我们遍历到数字 3 时我们要不要开始数数寻找 4, 5...不要。因为3的前面有2。既然2存在3肯定不是一个连续序列的开头。我们应该等待遍历到2甚至1时再处理。规则只有当num - 1不在哈希表中时num才是序列的起点我们才开始向后计数。3. 代码实现与详解Javaclass Solution { public int longestConsecutive(int[] nums) { // 1. 使用 HashSet 存储所有数字实现 O(1) 查询并去重 SetInteger num_set new HashSetInteger(); for (int num : nums) { num_set.add(num); } int longestStreak 0; // 2. 遍历哈希表中的每个数字 for (int num : num_set) { // 3. 【关键判断】只有当 num 是序列的起点时即 num-1 不存在才开始匹配 if (!num_set.contains(num - 1)) { int currentNum num; int currentStreak 1; // 4. 不断查询 num1, num2... 是否存在 while (num_set.contains(currentNum 1)) { currentNum 1; currentStreak 1; } // 5. 更新最大长度 longestStreak Math.max(longestStreak, currentStreak); } } return longestStreak; } }4. 深度解析为什么这是 O(N)很多初学者看到for循环里套了一个while循环第一反应就是“这不是吗”其实不然。我们要从每个元素被访问的次数来分析外层循环每个元素最多被访问 1 次。内层while循环只有当一个数是“起点”时才会进入while。举例[1, 2, 3, 4]。访问44-1存在跳过。访问33-1存在跳过。访问22-1存在跳过。访问11-1不存在是起点。进入while依次访问2, 3, 4。结论数组中的每个数字只会被while循环内部访问最多一次就是在统计属于它的那个序列长度时。总操作次数(存入Set) (外层遍历) (内层while累计总次数)。即忽略常数后为。5. 易错点分析遍历nums还是遍历Set在实现时有人会习惯写成for (int num : nums)来遍历原数组。虽然在大多数情况下也能通过但存在隐患。潜在风险重复元素的陷阱如果输入数组包含大量重复的“起点”例如nums [1, 1, 1, ..., 1, 2, 3, 4, ... 1000]遍历nums程序会遇到第一个1发现0不在扫描一遍1到1000。接着遇到第二个1又扫描一遍1到1000……这将导致算法退化为并超时。遍历Set官方解法Set天然去重。无论原数组有多少个1Set中只有一个1内层循环只会执行一次。因此始终推荐遍历Set而不是原数组这是保证算法稳定的最佳实践。总结解决 LeetCode 128 题的关键在于转换思维空间换时间用哈希表代替排序消除的瓶颈。剪枝优化通过!set.contains(x-1)这一判断精准定位序列起点避免了对同一个序列中间元素的重复无效计算将复杂度严格控制在。