数组中的最长连续子序列
问题简述
给定无序数组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