当前位置: 面试刷题>> 最长连续序列(经典算法150题)


### 题目描述 给定一个未排序的整数数组 `nums`,找出其中最长连续元素序列的长度。要求算法的时间复杂度为 O(n),其中 n 是数组 `nums` 的长度。 **示例 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 ``` ### 解题思路 1. 使用一个哈希集合(HashSet)来存储数组中的所有元素,以便快速查找某个元素是否存在。 2. 遍历数组中的每个元素 `num`,仅当 `num - 1` 不在哈希集合中时,才开始从 `num` 出发查找连续序列。这是为了避免重复计算连续序列(即,对于数组中的每个连续序列,我们仅从最小的元素开始计算一次)。 3. 对于每个满足条件的 `num`,开始向后查找连续的数,直到某个数不在哈希集合中为止,记录下这段连续序列的长度。 4. 在遍历过程中,不断更新最长连续序列的长度。 ### PHP 代码示例 ```php function longestConsecutive($nums) { if (empty($nums)) { return 0; } $numSet = array_flip($nums); // 使用数组翻转创建哈希集合 $maxLength = 0; foreach ($nums as $num) { if (!isset($numSet[$num - 1])) { // 仅当 num-1 不在集合中时开始检查 $currentNum = $num; $currentLength = 1; while (isset($numSet[$currentNum + 1])) { // 向后查找连续序列 $currentNum++; $currentLength++; } $maxLength = max($maxLength, $currentLength); } } return $maxLength; } ``` ### Python 代码示例 ```python def longestConsecutive(nums): if not nums: return 0 num_set = set(nums) max_length = 0 for num in nums: if num - 1 not in num_set: # 仅当 num-1 不在集合中时开始检查 current_num = num current_length = 1 while current_num + 1 in num_set: # 向后查找连续序列 current_num += 1 current_length += 1 max_length = max(max_length, current_length) return max_length ``` ### JavaScript 代码示例 ```javascript function longestConsecutive(nums) { if (nums.length === 0) { return 0; } const numSet = new Set(nums); let maxLength = 0; for (let num of nums) { if (!numSet.has(num - 1)) { // 仅当 num-1 不在集合中时开始检查 let currentNum = num; let currentLength = 1; while (numSet.has(currentNum + 1)) { // 向后查找连续序列 currentNum++; currentLength++; } maxLength = Math.max(maxLength, currentLength); } } return maxLength; } ``` 在以上三种语言的实现中,我们都遵循了相同的逻辑,并且使用了哈希集合来优化查找过程,以确保算法的时间复杂度为 O(n)。
推荐面试题