#include <algorithm>
#include <vector>
class Solution {
public:
/**
*
* @param num int整型vector
* @return int整型
*/
int longestConsecutive(vector<int>& num) { // 哈希表查找是o(1)
// write code here
unordered_set<int> res;
for (int n : num) {
res.insert(n);
}
int maxLength = 0;
for (int n : num) {
if (res.find(n - 1) == res.end()) {
int currentNum = n;
int currentLength = 1;
while (res.find(currentNum + 1) != res.end()) {
currentNum++;
currentLength++;
}
maxLength = max(maxLength, currentLength);
}
}
return maxLength;
}
};
- 哈希表存储元素:使用哈希表(在 C++ 中可以用
unordered_set
,在 Python 中可以用 set
)来存储数组中的所有元素。哈希表的特点是查找元素的时间复杂度接近 O(1) ,相比在数组中线性查找元素(时间复杂度 O(n) )要快很多。例如,在判断一个数是否在数组中时,如果用数组线性查找,最坏情况要遍历整个数组;而用哈希表,能快速得到结果。 - 确定连续序列起始点:遍历数组中的每个元素,对于某个元素
x
,先判断 x - 1
是否在哈希表中。如果 x - 1
不在哈希表中,这就表明 x
是某个连续序列的起始数字。因为如果 x - 1
存在,那么以 x
为起始的连续序列就可以和前面的数连接起来,x
就不是真正的起始点了。比如在数组 [1, 2, 3]
中,2 就不是起始点,因为 1 存在,连续序列从 1 开始。 - 扩展连续序列并统计长度:当确定
x
是起始数字后,从 x
开始不断找下一个连续的数字,也就是判断 x + 1
、x + 2
等是否在哈希表中。每找到一个连续的数字,就更新当前连续序列的长度。例如,确定 1 是起始数字后,发现 2 也在哈希表中,此时连续序列长度从 1 变为 2 ,继续判断 3 ,如果 3 也在,长度就变为 3 ,依此类推。 - 更新最长长度:在遍历数组并对每个起始数字扩展连续序列的过程中,记录下每次得到的连续序列长度,不断和当前已知的最长连续序列长度比较,取较大值更新最长长度。遍历完整个数组后,得到的最长长度就是题目要求的结果。