problem
Given an unsorted array of integers, find the length of the longest
consecutive elements sequence.For example, Given [100, 4, 200, 1, 3, 2], The longest consecutive
elements sequence is [1, 2, 3, 4]. Return its length: 4.Your algorithm should run in O(n) complexity.
solution
可以把这个问题考虑为数字在数轴上的覆盖,我们使用一个哈希表存储连续数值的端点和对应的长度,这样如果新遍历的数左边或右边可以和已有的区间连上的话就可以对原有的区间进行扩张。
class Solution(object):
def longestConsecutive(self, nums):
n = len(nums)
d = {}
ans = 0
for i in nums:
if i not in d:
left = d.get(i-1, 0)
right = d.get(i+1, 0)
length = left + right + 1
ans = max(ans, length)
d[i] = length
d[i-left] = length
d[i+right] = length
return ans
总结
- 重复数字直接跳过就行,不用删除记录
- 对于左右两个区间是否存在的情况,不用使用条件判断,直接把左右长度记录下来就行,然后根据数值进行处理。
- 存储时尽量存储原始值,也就是区间的端点,不用+1或-1,在遍历时处理这些细节就行(我之前就是存储的+1或-1,这样会出现两个数组夹着一个数的情况,不好处理),所以使用hash表时尽量避免key碰撞。