问题描述
给定一个无序的子序列,判定这个子序列中最长的连续子序列的长度。子序列是这样定义的:比如给定{2, 3, 100, 5, 4},那么2, 3, 4, 5就算是一个连续的子序列。假设没有重复的数据。
解题思路
O
(
n
)
O(n)
O(n)的复杂度,借助std::unordered_set
实现,把所有的元素构造到一个Hash Set中,那么查找和删除的复杂度是
O
(
1
)
O(1)
O(1)。之后遍历搜寻即可,具体逻辑参考代码。
实现代码
#include <iostream>
#include <unordered_set>
#include <vector>
#include <algorithm>
int longestContinuousSeq(const std::vector<int>& num) {
std::unordered_set<int> myset(num.begin(), num.end());
int ans = 0;
for (int i = 0; i < num.size(); ++i) {
if (myset.find(num[i]) == myset.end()) {
continue;
}
int pre = num[i] - 1;
int next = num[i] + 1;
while (myset.find(pre) != myset.end()) {
myset.erase(pre);
--pre;
}
while (myset.find(next) != myset.end()) {
myset.erase(next);
++next;
}
ans = std::max(ans, next - pre - 1);
}
return ans;
}
int main() {
std::vector<int> num {2, 3, 100, 5, 4};
std::cout << longestContinuousSeq(num) << std::endl;
return 0;
}