public int longestConsecutive(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
UnionFind uf = new UnionFind(n);
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
if (map.containsKey(nums[i] - 1)) {
uf.union(i, map.get(nums[i] - 1));
if (map.containsKey(nums[i] + 1)) {
uf.union(i, map.get(nums[i] + 1));
public UnionFind(int n) {
for (int i = 0; i < n; i++) {
public int find(int node) {
while (node != sets[node]) {
public void union(int i, int j) {
if (size[node1] < size[node2]) {
size[node2] += size[node1];
size[node1] += size[node2];
for (int i = 0; i < size.length; i++) {
res = Math.max(res, size[i]);