开始的思路是建立一个vector做哈希,下标映射nums元素,值存储以该值为最后一个元素的最长序列。
但这样有很多问题,比如原先1、2、3、5、6、7都有值,此时插入一个4如何更新5、6、7?还有如果nums形如[1, 2 ,3 , 10000]建立vector就会有很多冗余空间浪费
<aside> 💡 重点:只从一条序列中的第一个元素开始计算(即 n - 1 不在哈希表中),其余元素跳过
</aside>
这样的话当拿到一个数字n时,我们只需要考虑 n+1 是否在nums中,这样就解决了自己思路中形如插入4时难以连接两个子序列的问题
由于只需要检测元素是否存在而不需要对其进行映射,所以选择unordered_set容器。同时,题目要求时间复杂度为O(n),而unordered_set搜索一次的时间复杂度为O(1),也能满足时间复杂度要求
// unordered_set搜索元素的时间复杂度是O(1)
int longestConsecutive(vector<int>& nums) {
unordered_set<int> st;
for (int num : nums)
st.insert(num);
int ans = 0;
for (int num : nums) {
// 只从一条序列中的第一个元素开始计算(即 n - 1 不在哈希表中),其余元素跳过
// 这样保证每个元素只会被哈希表搜索一次,减少冗余计算
if (st.count(num - 1) == 0) {
int n = num;
int count = 1;
while (st.count(++n))
++count;
ans = std::max(ans, count);
}
}
return ans;
}