1 class UnionFind 2 { 3 public: 4 vector<int> parent; // 存储若干棵树 5 vector<int> size; // 记录每棵树包含的节点数 6 7 UnionFind(int n) 8 { 9 parent = vector<int>(n); 10 size = vector<int>(n); 11 for (int i = 0; i < n; i++) 12 { 13 parent[i] = i; 14 size[i] = 1; 15 } 16 } 17 18 /* 将 p 和 q 连通 */ 19 void Union(int p, int q) 20 { 21 int rootP = Find(p); 22 int rootQ = Find(q); 23 if (rootP == rootQ) return; 24 25 // 小树接到大树下面,较平衡 26 if (size[rootP] > size[rootQ]) 27 { 28 parent[rootQ] = rootP; 29 size[rootP] += size[rootQ]; 30 } 31 else 32 { 33 parent[rootP] = rootQ; 34 size[rootQ] += size[rootP]; 35 } 36 } 37 38 /* 返回节点 x 的根节点 */ 39 int Find(int x) 40 { 41 if (parent[x] != x) // 进行路径压缩 42 { 43 parent[x] = Find(parent[x]); 44 } 45 return parent[x]; 46 } 47 }; 48 49 class Solution 50 { 51 public: 52 int longestConsecutive(vector<int>& nums) 53 { 54 if(nums.empty()) return 0; 55 int n = nums.size(); 56 UnionFind UF(n); 57 unordered_map<int,int> hash; 58 for(int i = 0;i < nums.size();i ++) hash[nums[i]] = i; 59 for(int i = 0;i < n;i ++) 60 { 61 if(hash.count(nums[i] + 1)) UF.Union(hash[nums[i]],hash[nums[i] + 1]); 62 if(hash.count(nums[i] - 1)) UF.Union(hash[nums[i] - 1],hash[nums[i]]); 63 } 64 int res = 1; 65 for(auto a : UF.size) 66 { 67 if(a > res) res = a; 68 } 69 return res; 70 } 71 };