题意
给一个数组,求这个数组中一个最大的子集,要求其是连续的。
要求:O(n)时间
思路
首先,显然不能排序了。
我们考虑把这个数插入到unordered_set
里面。
假设我们从数组中选一个数x作为子集的一部分,那么我们需要找一个区间[l,r],使x∈[l,r]且[l,r]里面的所有数都应该在数组中出现过。判断一个数是否出现过,我们可以直接在unodered_set
里面O(1)的去查找。
所以,就可以得到我们的算法:
- 枚举x,并且从set里面删除x。
- 令
l=x−1 ,r=x+1,在unordered_set
里面O(1)的去查找l和r ,如果找到l,从set里面删除当前l ,l继续减小。找到r ,从set里面删除当前r,r 继续增大。当l和r 都不能继续变化的时候,记录当前最大长度。 - 更新最后结果
代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> has(nums.begin(), nums.end());
int ans = 0;
for (auto x : nums) {
if (has.count(x)) {
int l = x - 1, r = x + 1, cnt = 1;
while (1) {
auto it = has.find(l);
if (it == has.end()) break;
cnt++, l--, has.erase(it);
}
while (1) {
auto it = has.find(r);
if (it == has.end()) break;
cnt++, r++, has.erase(it);
}
ans = max(ans, cnt);
}
}
return ans;
}
};