思路:可以先排序再开始搜索,但是时间复杂度最快要O(nlog(n))。考虑hash方法,将每个元素映射到唯一的一个hash表中,然后再搜索。对于当前元素,查看左右两边是否存在值,如果存在就继续搜索。注意,搜索过的元素可以在hash表中删除,这样能够减少运行时间,因为搜索过的就不必再次进行搜索了。刚开始我没有删除搜索过的元素,所以超时了,更正后可以Accept.
class Solution {
public:
int longestConsecutive(vector<int> &num) {
unordered_map<int,int> f;
int max_v(1);
for(auto val: num)
f[val] = 1;
for(auto val: num){
int left = val - 1, right = val + 1;
while (f[left]){
f[left] = 0;
left--;
}
while(f[right]){
f[right] = 0;
right++;
}
max_v = max(max_v,right-left-1);
}
return max_v;
}
};