这道题,我想最简单的做法就是先排序,然后顺序记录最长子序列。这样基本不需要辅助空间。
如果要实现时间复杂度为O(n)的方法,那么就得用空间来换时间,所以得找一种数据结构来存储,并且很快知道相邻关系。可以使用hash表或者set来存储,这样当一个数num存进去,我就能判断num-1 和num+1在不在里面了。
从而我们可以使用set去完成,假设num-1在里面,那么就不应该从num开始计数,从而继续向前检查,直到num-1不在里面,那这样就能将子序列遍历完,并且是最长的。
code:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for (const int& num : nums) {
num_set.insert(num);
}
int longestStreak = 0;
for (const int& num : num_set) {
if (!num_set.count(num - 1)) {
int currentNum = num;
int currentStreak = 1;
while (num_set.count(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
longestStreak = max(longestStreak, currentStreak);
}
}
return longestStreak;
}
};