https://leetcode.com/problems/longest-consecutive-sequence/
这个问题做到O(n)还是需要动一番脑筋。注意:不是找最长递增子序列。
思路:注意到每个元素必属于一个连续递增序列,而且不会出现重复,有点并查集的感觉。所以我们只要找到每个元素所属的连续序列,取最长的即可。由于有的元素属于同一个连续序列,考察完一个连续序列后把其中所有的元素删除可以避免重复考察。
算法:先把数组中所有元素放到一个Hash Set中,然后遍历数组每个元素,考察该元素所在的最长连续序列(看比该元素小和大的元素是否也在set中,即连续减1/加1能延伸到多远,考察一个就删除一个),记录最长的序列长度即可。
在hash set中,每个元素都被插入和删除一次,平摊复杂度是O(n)。
class Solution {
public:
int longestConsecutive(vector<int> &nums) {
if (nums.empty()) return 0;
unordered_set<int> myset(nums.begin(), nums.end());
int ret = 1;
for (auto num : nums) {
if (myset.empty()) break;
if (myset.count(num) == 0) continue;
int len = 1;
// lower
int lower = num - 1;
while (myset.count(lower) == 1) {
myset.erase(lower);
len++; lower--;
}
// higher
int higher = num + 1;
while (myset.count(higher) == 1) {
myset.erase(higher);
len++; higher++;
}
myset.erase(num);
ret = max(ret, len);
}
return ret;
}
};