下面简单记录一下两种解法的思路:
- 解法一
想法很朴素,遍历数组中每一个数,比如x;
然后,检查x+1,x+2等是否在给定数组中,直到x+y(从x开始的连续序列的终点),那么它的临时长度是y+1;
对数组中每一个元素的临时长度取最大,得到最终答案。
class Solution:
# 解法一
def longestConsecutive(self, nums: List[int]) -> int:
res=0
nums_set=set(nums)
for num in nums_set:
if num-1 not in nums_set:
cur_num=num
cur_len=1
while cur_num+1 in nums_set:
cur_len+=1
cur_num+=1
res=max(res,cur_len)
return res
- 解法二
我觉得这个解法不容易想到。
定义变量res,用于记录答案;
首先,建立一个字典dics,字典中的键值对分为有效和无效两种情况,有效的键值对<key,value>表示以key这个值为端点的连续序列的长度为value,无效的键值对是算法进行过程中的副产品,并无实际意义;
然后,遍历数组,对每一个数num,初始化dics[num]=1,表示暂时设置num所在区间的长度为1;
接着,根据字典dics找到num-1所在连续区间的长度(如果num-1还没有被记录在字典dics中,那么返回0),记为left;根据字典dics找到num+1所在连续区间的长度(如果num+1还没有被记录在字典dics中,那么返回0),记为right;
于是,得到数num目前所在连续区间的长度cur_len=left+1+right;
然后,更新答案res=max(res,cur_len);更新数num目前所在连续区间的长度(注意:只对该连续区间的左右端点更新)dics[num-left]=cur_len,dics[num_right]=cur_len。
class Solution:
# 解法2
def longestConsecutive(self, nums: List[int]) -> int:
res=0
dics={}
for num in nums:
if num not in dics:
left=dics.get(num-1,0)
right=dics.get(num+1,0)
dics[num]=1
length=left+1+right
res=max(res,length)
dics[num-left]=length
dics[num+right]=length
return res