GuilinDev

Lc2092

05 August 2008

2092. Find All People With Secret

给一个整数 n,表示有 n 个人,编号从 0 到 n - 1。还给你一个 0 索引的 2D 整数数组 meeting,其中 meeting[i] = [xi, yi, timei] 表示个人 xi 和 person我在timei开会。一个人可以同时参加多个会议。最后,给一个整数 firstPerson。

个人 0 有一个秘密,并且最初在时间 0 与一个人 firstPerson 共享该秘密。然后,每次与拥有该秘密的人开会时都会共享该秘密。更正式地说,对于每次会议,如果某个人 xi 在时间 i 有秘密,那么他们将与人 yi 分享秘密,反之亦然。

秘密立即共享。也就是说,一个人可能会收到秘密并在同一时间范围内与其他会议中的人分享。

在所有会议举行后,返回所有知道秘密的人的名单。您可以按任何顺序返回答案。

PriorityQueue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
    public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
        Map<Integer, List<int[]>> child = new HashMap<>();
        for (int i = 0; i < n; i++) {
            child.put(i, new ArrayList<>());
        }
        for (int[] meeting : meetings) {
            child.get(meeting[0]).add(new int[]{meeting[1], meeting[2]});
            child.get(meeting[1]).add(new int[]{meeting[0], meeting[2]});
        }
        PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> (a[1] - b[1]));
        Set<Integer> visited = new HashSet<>();
        visited.add(0);
        visited.add(firstPerson);

        for (int[] item : child.get(firstPerson)) {
            queue.add(item);
        }
        for (int[] item : child.get(0)) {
            queue.add(item);
        }

        List<Integer> result = new ArrayList<>();
        result.add(0);
        result.add(firstPerson);
        int least_time = 0;

        while (!queue.isEmpty()) {
            int[] cur = queue.poll();

            if (least_time <= cur[1]) {
                least_time = cur[1];
                if (!visited.contains(cur[0])) {
                    visited.add(cur[0]);
                    result.add(cur[0]);
                    for (int[] item : child.get(cur[0])) {
                        queue.add(item);
                    }
                }
            }
        }
        return result;

    }
}