数组中的最长连续子序列
Last updated
Last updated
问题简述
思路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
这一步操作;
其他思路