LeetCode 第 128 题:最长连续序列(哈希表、并查集)

方法一:哈希表

思路:只需要关心“连续序列”最小的那个数。

Java 代码:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    public int longestConsecutive(int[] nums) {
        int len = nums.length;

        Set<Integer> hashSet = new HashSet<>(len);
        for (int num : nums) {
            hashSet.add(num);
        }

        int res = 0;

        for (int num : hashSet) {
            if (hashSet.contains(num - 1)) {
                continue;
            }

            int cnt = 1;

            while (hashSet.contains(num + 1)) {
                cnt++;
                num++;
            }

            res = Math.max(res, cnt);
        }
        return res;
    }
}

方法二:并查集

Java 代码:

import java.util.HashMap;
import java.util.Map;

public class Solution {

    private class UnionFind {
        private Map<Integer, Integer> parent;
        private Map<Integer, Integer> size;

        public UnionFind(int[] nums) {
            int len = nums.length;
            parent = new HashMap<>(len);
            size = new HashMap<>(len);
            for (int num : nums) {
                parent.put(num, num);
                size.put(num, 1);
            }
        }

        public int union(int x, int y) {
            int rootX = find(x);
            int rootY = find(y);

            if (rootX == rootY) {
                return 0;
            }
            parent.put(rootX, rootY);
            int sum = size.get(rootX) + size.get(rootY);
            size.put(rootY, sum);
            return sum;
        }

        /**
         * 实现了路径压缩
         *
         * @param x
         * @return
         */
        public int find(int x) {
            while (x != parent.get(x)) {
                parent.put(x, parent.get(parent.get(x)));
                x = parent.get(x);
            }
            return x;
        }

        public boolean contains(int x) {
            return parent.containsKey(x);
        }
    }

    public int longestConsecutive(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        UnionFind unionFind = new UnionFind(nums);

        int res = 1;

        for (int num : nums) {
            if (unionFind.contains(num - 1)) {
                res = Math.max(res, unionFind.union(num, num - 1));
            }

            if (unionFind.contains(num + 1)) {
                res = Math.max(res, unionFind.union(num, num + 1));
            }
        }
        return res;
    }
}
发布了442 篇原创文章 · 获赞 330 · 访问量 123万+

猜你喜欢

转载自blog.csdn.net/lw_power/article/details/103758868
今日推荐