https://leetcode.com/problems/longest-consecutive-sequence/description/
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> all_nums;
unordered_map<int, int> unions_rev; // <end_idx, start_idx>
unordered_map<int, int> unions; // <start_idx, end_idx>
int max_length = 0;
for (int num : nums)
{
auto it_r_union = unions_rev.find(num - 1);
auto it_union = unions.find(num + 1);
int start_idx = num;
int end_idx = num;
if (all_nums.find(num) != all_nums.end())
continue;
if (it_union != unions.end() && it_r_union != unions_rev.end())
{
// [RRR] num [SSS]
start_idx = it_r_union->second;
end_idx = it_union->second;
unions_rev.erase(it_r_union);
unions.erase(start_idx);
unions.erase(it_union);
unions_rev.erase(end_idx);
}
else if (it_union != unions.end())
{
// num [SSS]
end_idx = it_union->second;
unions.erase(it_union);
unions_rev.erase(end_idx);
}
else if (it_r_union != unions_rev.end())
{
// [RRR] num
start_idx = it_r_union->second;
unions_rev.erase(it_r_union);
unions.erase(start_idx);
}
unions[start_idx] = end_idx;
unions_rev[end_idx] = start_idx;
if (end_idx - start_idx + 1 > max_length)
{
max_length = end_idx - start_idx + 1;
}
all_nums.insert(num);
}
return max_length;
}
};


