LeetCode第128题,在一个序列中找最长的连续序列。要求在O(n)复杂度下完成。
排序是可以完成的,但是复杂度最低也是O(nlogn),因此考虑hash。
hash可以先把每个数存起来,然后遍历这些数,往两边扩展寻找连续的数,如果找到了就在hash里删除这个数。
这里删除操作是核心,因为如果一个数在这个连续序列当中,那么以这个数为中心扩展,找到的仍然是这个连续序列,因此完全不需要再以这个数为中心查找。这样就是看上去整个方法复杂度是O(n^2),实际上只有O(n)的原因。
python版本
class Solution(object):
def longestConsecutive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
d = {}
res = 0
for num in nums:
d[num] = 1
for i in nums:
length = 1
j = i-1
while d.has_key(j):
del d[j]
j -= 1
length += 1
k = i+1
while d.has_key(k):
del d[k]
k += 1
length += 1
res = max(res, length)
return res
c++大神版本
class Solution {
public:
int longestConsecutive(const vector<int> &nums) {
unordered_set<int> my_set;
for (auto i : nums) my_set.insert(i);
int longest = 0;
for (auto i : nums) {
int length = 1;
for (int j = i - 1; my_set.find(j) != my_set.end(); --j) {
my_set.erase(j);
++length;
}
for (int j = i + 1; my_set.find(j) != my_set.end(); ++j) {
my_set.erase(j);
++length;
}
longest = max(longest, length);
}
return longest;
}
};