其他分享
首页 > 其他分享> > 128. 最长连续序列

128. 最长连续序列

作者:互联网

 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 };

 

标签:hash,parent,nums,int,序列,128,rootQ,最长,size
来源: https://www.cnblogs.com/yuhong1103/p/12887943.html