数组中的最长连续子序列
问题简述
给定无序数组arr,返回其中最长的连续序列的长度(要求值连续,位置可以不连续,例如 3,4,5,6为连续的自然数)
思路1:排序+滑动窗口
先排序(
O(NlngN)
);然后使用滑动窗口模板;
易错点:考虑
[0,1,1,2,3]
,答案应该是 4 而不是 3;所以还要使用一个变量来记录区间内的重复值;
思路2:哈希表
不算是标准的动态规划,因为它不满足无后效性;
哈希表中的 key 和 value 分别表示什么?
区间长度
value
和它的两个端点[key1, key2]
;如果
value = 1
,则key1 == key2
;
算法流程:
初始化哈希表
book
;遍历
arr
中每个x
;若
x
不在book
中,执行:初始化
book[x] = 1
表示区间[x, x]
的长度为 1(也可以理解为 x 出现过的标记);查询
l = book[x-1]
和r = book[x+1]
,分别表示x
左右区间的长度,若不存在则为0
;则[x-l, x+r]
这段区间内的长度为l + 1 + r
;根据
book
的定义,因为x
把左右区间连通了,所以需要更新book[x-l]
和book[x+r]
为什么
book[x-1]
和book[x+1]
代表的区间一定在x
两侧?换言之,为什么这两个区间是[x-l, x-1]
和[x+1, x+r]
,而不是[x-1, x+l]
和[x-r, x+1]
?;因为执行上述操作的前提是
x
没有出现过;如果x
出现过,就和book
的定义发生了冲突,即违反了book[x - l] = book[x + r] = l + 1 + r
这一步操作;
其他思路
Last updated