题目:
解题思路:
- 去重;
- 遍历去重后的集合,对于每一个元素x,我们尝试以它作为连续序列的起点;
- 判断是否为连续序列的起点;
- 如果x是连续序列的起点,我们从x+1开始,不断检查numset中是否包含y(初始时y=x+1),如果包含,则y自增,继续检查下一个数。这个过程会一直持续到numset中不包含y为止。
- 更新最长连续序列的长度;
代码实现:
var longestConsecutive = function(nums) {
// 使用Set去重
let numset = new Set(nums);
let ans = 0; // 最长连续序列的长度
// 遍历去重后的集合
for (let x of numset) {
// 如果集合中包含x-1,则x不是连续序列的起点
if (numset.has(x - 1)) {
continue;
}
let y = x + 1;
// 寻找连续序列的终点
while (numset.has(y)) {
y++;
}
// 更新最长连续序列的长度
ans = Math.max(ans, y - x);
}
// 返回最长连续序列的长度
return ans;
};
复杂度分析:
- 时间复杂度:由于我们使用了Set来去重,并且对每个元素只进行了一次遍历和连续的查找,所以时间复杂度为O(n),其中n是数组nums的长度。
- 空间复杂度:我们使用了一个Set来存储去重后的元素,所以空间复杂度也是O(n)。