返回
128. 最长连续序列:打造最优解法,见证算法之美
后端
2023-09-07 09:15:25
**128. 最长连续序列**
**题目**
给定一个未排序的整数数组 nums ,找出其中最长连续序列的长度。
连续序列是指每个数字都比前一个数字大 1 的数字序列。
**示例 1:**
输入:nums = [100, 4, 200, 1, 3, 2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4]。
**示例 2:**
输入:nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
输出:9
解释:最长连续序列是 [0, 1, 2, 3, 4, 5, 6, 7, 8]。
**提示:**
* 1 <= nums.length <= 10^5
* -10^9 <= nums[i] <= 10^9
**最优解法**
这道题可以用动态规划来解决。我们可以创建一个哈希表来存储每个数字出现的次数,然后从每个数字开始,向两边扩展,直到遇到已经访问过的数字或超过数组边界。在扩展过程中,我们可以记录当前序列的长度,并更新最长连续序列的长度。
**具体实现步骤如下:**
1. 创建一个哈希表 `hash` 来存储每个数字出现的次数。
2. 遍历数组 `nums` 中的每个数字 `num`。
3. 检查 `hash[num - 1]` 是否存在。如果存在,则说明 `num` 不是连续序列的第一个数字,跳过当前数字。
4. 如果 `hash[num - 1]` 不存在,则说明 `num` 是连续序列的第一个数字。
5. 从 `num` 开始,向两边扩展,直到遇到已经访问过的数字或超过数组边界。
6. 在扩展过程中,记录当前序列的长度 `length`。
7. 更新最长连续序列的长度 `max_length`。
8. 将 `num` 及其出现的次数添加到哈希表 `hash` 中。
**代码实现**
```python
def longest_consecutive(nums):
"""
:type nums: List[int]
:rtype: int
"""
# 创建哈希表存储每个数字出现的次数
hash = {}
for num in nums:
hash[num] = 1
# 遍历数组中的每个数字
max_length = 0
for num in nums:
# 检查前一个数字是否在哈希表中
if num - 1 not in hash:
# 如果前一个数字不在哈希表中,则从当前数字开始扩展
length = 1
while num + 1 in hash:
num += 1
length += 1
# 更新最长连续序列的长度
max_length = max(max_length, length)
return max_length
时间复杂度
该算法的时间复杂度是 O(n),其中 n 是数组 nums
的长度。
空间复杂度
该算法的空间复杂度是 O(n),其中 n 是数组 nums
的长度。
总结
在这篇文章中,我们一起探索了 128. 最长连续序列这道题,揭秘了其最优解法背后的奥秘。我们深入浅出地讲解了算法、动态规划、数据结构和编程等知识,帮助你深刻理解问题的本质,掌握解决这类问题的通用方法。