class Solution {
public:
int longestConsecutive(vector<int> &num) {
int n = num.size();
if (n <= 1) {
return n;
}
unordered_map<int, int> mp;
int ans = 1;
for (int i = 0; i < n; ++i) {
int v = num[i];
unordered_map<int, int>::iterator itr = mp.find(v);
if (itr != mp.end()) {
continue;
}
unordered_map<int, int>::iterator itrleft = mp.find(v - 1);
unordered_map<int, int>::iterator itrright = mp.find(v + 1);
if (itrleft == mp.end() && itrright == mp.end()) {
mp[v] = v;
} else if (itrleft != mp.end() && itrright != mp.end()) {
ans = max(ans, itrright->second - itrleft->second + 1);
int vl = itrleft->second, vr = itrright->second;
mp[vl] = vr;
mp[vr] = vl;
mp[v] = v;
} else if (itrleft != mp.end()) {
mp[v] = itrleft->second;
mp[itrleft->second] = v;
ans = max(ans, v - mp[v] + 1);
} else if (itrright != mp.end()) {
mp[v] = itrright->second;
mp[itrright->second] = v;
ans = max(ans, mp[v] - v + 1);
}
}
return ans;
}
};