分享一下自己顺丰第二题并查集代码

import java.util.*;

class Node {
    int val = 0;
    int father = -1;
    boolean flag = false;// 避免算入未学习过的语言

    public Node(int val, int father) {
        this.val = val;
        this.father = father;
    }

    int getFather() {
        flag = true;
        if (father == -1) return val;
        else {
            int temp = Main.nodes[father].getFather();
            father = temp;
            return father;
        }
    }

    void set(int target) {
        int temp = getFather();
        target = Main.nodes[target].getFather();
        if (temp != target) {
            Main.nodes[temp].father = target;
        }
        if (target != val) father = target;
    }
}

class Main {
    public static Node[] nodes;


    public static void main(String[] args) {
        HashSet<Integer> integers = new HashSet<>();
        Scanner scanner = new Scanner(System.in);
        int n, m, k;
        Map<Integer, List<Integer>> map = new HashMap<>();
        n = scanner.nextInt();
        m = scanner.nextInt();
        k = scanner.nextInt();
        nodes = new Node[m + 1];
        for (int i = 0; i <= m; i++) nodes[i] = new Node(i, -1);
        for (int i = 0; i < k; i++) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            List<Integer> list = map.getOrDefault(a, new ArrayList<>());
            list.add(b);
            map.put(a, list);
        }

        for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
            for (int i : entry.getValue()) {
                int temp = entry.getValue().get(0);
                nodes[i].set(temp);
            }
        }



        for (Node node : nodes) {
            if (node.flag) {
                integers.add(node.getFather());

            }
        }
        int res = n - map.size() + integers.size() - 1;
        if (n == 2 && integers.size() == 0) res = 2;
        System.out.println(res);
    }
}

其实思路很简单,就是记录每个人会的语言并记录,形成并查集,最后结果为未连通的树(语言)-1+不会语言的人,这里需要考虑的特殊条件是如果两人都没有学习过语言,返回值会是1,应该是2(我在这个边界值卡了20分钟),虽然AC了,但是不一定保证没有bug,欢迎指正。

#笔试题目##顺丰科技#
全部评论
大佬
点赞 回复 分享
发布于 2019-08-29 21:26
大佬
点赞 回复 分享
发布于 2019-08-29 22:42
呃呃,我没有考虑k为0的情况,只通过了91%,不知道还有没有别的情况没有考虑到
点赞 回复 分享
发布于 2019-08-29 23:55
我是用的图,求连通域个数,最后的结果等于连通域个数-1。看楼上的说法忘了考虑k为0的情况过了91%,我还一直以为复杂度太高在减复杂度😂
点赞 回复 分享
发布于 2019-08-30 00:19
大佬
点赞 回复 分享
发布于 2019-08-30 00:22
请问楼主 如果3个人同时都不会语言,那么返回值应该是2还是3呢?
点赞 回复 分享
发布于 2019-08-30 12:11

相关推荐

不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
评论
7
28
分享
牛客网
牛客企业服务