描述
该题来自于力扣第128题
分析
只能O(n)
的时间复杂度,那么必须记住已经遍历过的数所在的连续区间的长度,仔细思考下:如果已知前面的数所在的连续区间的长度,那么当加入一个没出现过的数时,该数只能是之前连续区间的左端点或右端点,又或者根本无法构成连续区间。不可能是中点某个点的原因在于该数之前没有出现过。
如果用一个字典d
记录以遍历过数所在连续区间的长度,那么当遍历到未出现过的数n
时,如果与之前构成连续区间,可知只能是左端点或右端点,那么取出d[n-1]
和d[n+1]
,如果d[n-1]
存在则表示新数是某个连续区间的右端点,如果d[n+1]
存在则表示新数是某个新数的左端点,最后更新d[n]=d[n-1]+d[n+1]+1
;注意还是由于新数只会是某个连续区间左端点或右端点,从而新连续区间的左端点n-d[n-1]
和右端点n+d[n+1]
的所在区间的长度也需要更新,即d[n - d[n-1]]
和d[n + d[n+1]]
也要通过更新。
代码
1 | class Solution: |