1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class Solution { public: int longestConsecutive(vector<int>& nums) { UF uf; for (int n : nums) { if (uf.has(n)) continue; uf.add(n); if (uf.has(n - 1)) { uf.merge(n - 1, n); } if (uf.has(n + 1)) { uf.merge(n + 1, n); } } return uf.mx; }
struct UF { void add(int x) { parent[x] = x; size[x] = 1; mx = max(mx, 1); }
bool has(int x) { return parent.find(x) != parent.end(); }
int getParent(int x) { while (parent[x] != parent[parent[x]]) { x = parent[x] = parent[parent[x]]; } return parent[x]; }
void merge(int x, int y) { int px = getParent(x); int py = getParent(y); if (px != py) { parent[px] = py; int sz = size[px] + size[py]; size[px] = size[py] = sz; mx = max(mx, sz); } }
unordered_map<int, int> parent, size; int mx = 0; }; };
|