当前位置: 面试刷题>> 最长连续序列 (经典算法题500道)
### 题目描述补充
题目:**最长连续序列**
给定一个未排序的整数数组 `nums`,找出数字连续的最长序列(至少包含两个数)的长度。要求算法的时间复杂度为 O(n),其中 n 是数组的长度。
**示例 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
```
### 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])) {
$currentNum = $num;
$currentLength = 1;
// 查找当前数字开始的连续序列的长度
while (isset($numSet[$currentNum + 1])) {
$currentNum++;
$currentLength++;
}
$maxLength = max($maxLength, $currentLength);
}
}
return $maxLength >= 2 ? $maxLength : 0; // 确保返回的长度至少为2
}
// 测试
$nums = [100, 4, 200, 1, 3, 2];
echo longestConsecutive($nums); // 输出 4
```
### 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: # 检查是否是连续序列的起点
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 if max_length > 1 else 0
# 测试
nums = [100, 4, 200, 1, 3, 2]
print(longestConsecutive(nums)) # 输出 4
```
### 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)) { // 检查是否是连续序列的起点
let currentNum = num;
let currentLength = 1;
while (numSet.has(currentNum + 1)) {
currentNum++;
currentLength++;
}
maxLength = Math.max(maxLength, currentLength);
}
}
return maxLength >= 2 ? maxLength : 0; // 确保返回的长度至少为2
}
// 测试
const nums = [100, 4, 200, 1, 3, 2];
console.log(longestConsecutive(nums)); // 输出 4
```
**码小课**:在编程学习的道路上,掌握算法和数据结构是基础而关键的一步。以上代码示例不仅展示了如何解决问题,还体现了在算法设计中如何平衡时间复杂度和空间复杂度的思考。码小课网站中有更多关于算法和数据结构的精彩内容,欢迎大家前往学习交流,共同进步。