最长连续序列 哈希表
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(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
思路:
这道题第一次见肯定是不会做的,没有关系。直接将思路吧,记住这个套路即可。
要想实现复杂度为O(n),得配合哈希表来做(正所谓以空间换时间~)。我们定义一个哈希表来存储每一个值所处的连续区间的长度。
现在哈希表内部为空,接着我们一个个遍历数组,将数组元素放入哈希表,放入哈希表的同时,先检查这个元素的左右值在不在表内。比如我们放入3的时候,检查一下left=hash_dict[2]和right=hash_dict[4]这二者在不在哈希表里,不在的话值就取0;如果在的话,那么说明这两个数字可以和3连起来,则hash_dict[3]= hash_dict[2]+1+ hash_dict[4],中间的1是3自己一个数的长度。
每次可以相连的时候,就有可能出现新的最大长度,与全局变量max_len进行比较和更新。同时,因为这整个区间的长度因为相连扩大了,为了让这个新的大区间还可以同样地被它相邻两侧的数值相连,我们需要更新一下这个区间左右两端在哈希表的值。定位到这两端的值也很简单,还是接着上面放入3的时候,算出了left和right之后,hash_dict[3-left]就是左边界,hash_dict[3+right]就是右边界。
好啦,可以一知半解地去看代码了,这边思路看懂50%的理解就够用了。
代码:
class Solution(object):
def longestConsecutive(self, nums):
#哈希表 存储每个值所处的连续区间的长度
hash_dict = dict()
max_len=0
for n in nums:
#当这个值不在哈希表中时,证明它还没被连起来
if n not in hash_dict:
#得到它左右的值对应的长度
left = hash_dict.get(n-1,0)
right = hash_dict.get(n+1,0)
#它自己在中间为1,所以他的长度加起来
cur_len =left+right+1
max_len = max(max_len,cur_len)#迭代更新全局变量
#更新这个区间长度,三个地方:哈希表这个值以及两个边界处都更新为cur_len
hash_dict[n]=cur_len
hash_dict[n-left]=cur_len
hash_dict[n+right]=cur_len
return max_len
小结:
上面这段代码,把我写的注释去掉,其实是一个非常简短、逻辑清晰的程序。这题主要难点就是想不到用哈希表来做,就算知道用哈希表,整体理解起来也不是很容易,还是说就一半理解一半记忆最好了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了