128.Longest Consecutive Sequence
题目
Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence.
You must write an algorithm that runs in O(n) time.
Example 1:
Input: nums = [100,4,200,1,3,2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.
Example 2:
Input: nums = [0,3,7,2,5,8,4,6,0,1] Output: 9
Example 3:
Input: nums = [1,0,1,2] Output: 3
Constraints:
0 <= nums.length <= 105-109 <= nums[i] <= 109
Related Topics
解法一
通过 set 哈希表,创建步骤的时间复杂度竟然可以忽略不计。
- 寻找序列头部,如果 num - 1 不在 set 内,则可取为序列头部
- 寻找以头部开始,寻找最长的序列
python
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
s = set(nums)
res = 0
# 遍历数组会造成空间浪费(数组中可能存在重复的元素)
for i in range(len(nums)):
seq = 1
if nums[i] - 1 in s:
continue
else:
while nums[i] + seq in s:
seq += 1
res = max(res, seq)
return res- 时间复杂度O(N)
- N = len(nums)
- 空间复杂度O(N)
解法二
题目中数组可能存在重复元素,因此遍历时可选用 set 为遍历的对象
py
from typing import List
# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
s = set(nums)
res = 0
# 遍历数组会造成空间浪费(数组中可能存在重复的元素)
for num in s:
seq = 1
if num - 1 in s:
continue
else:
while num + seq in s:
seq += 1
res = max(res, seq)
return res
# leetcode submit region end(Prohibit modification and deletion)
Solution().longestConsecutive([100,4,200,1,3,2])复杂度分析
- 时间复杂度O(N)
- N = size of set <= length of nums
- 空间复杂度O(N)