|
1 | 1 | class Solution {
|
2 | 2 | public int findCircleNum(int[][] M) {
|
3 |
| - Map<Integer, List<Integer>> map = new HashMap<>(); |
4 |
| - for (int i=0; i<M.length; i++) { |
5 |
| - for (int j=0; j<M[i].length; j++) { |
| 3 | + Map<Integer, Set<Integer>> map = new HashMap<>(); |
| 4 | + for (int i = 0; i < M.length; i++) { |
| 5 | + for (int j = 0; j < M.length; j++) { |
6 | 6 | if (M[i][j] == 1) {
|
7 |
| - map.computeIfAbsent(i, k -> new ArrayList<>()).add(j); |
8 |
| - map.computeIfAbsent(j, k -> new ArrayList<>()).add(i); |
| 7 | + map.computeIfAbsent(i, k -> new HashSet<>()).add(j); |
9 | 8 | }
|
10 | 9 | }
|
11 | 10 | }
|
12 |
| - |
13 |
| - Set<Integer> set = new HashSet<>(); |
| 11 | + |
| 12 | + return dfs(map, M.length); |
| 13 | + } |
| 14 | + |
| 15 | + private int dfs(Map<Integer, Set<Integer>> map, int n) { |
14 | 16 | int count = 0;
|
15 |
| - Queue<Integer> queue = new LinkedList<>(); |
16 |
| - |
17 |
| - for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) { |
18 |
| - if (set.contains(entry.getKey())) { |
19 |
| - continue; |
| 17 | + Set<Integer> seen = new HashSet<>(); |
| 18 | + |
| 19 | + for (int i = 0; i < n; i++) { |
| 20 | + if (!seen.contains(i)) { |
| 21 | + dfsHelper(i, seen, map); |
| 22 | + count++; |
20 | 23 | }
|
21 |
| - |
22 |
| - queue.add(entry.getKey()); |
23 |
| - |
24 |
| - while (!queue.isEmpty()) { |
25 |
| - int popped = queue.remove(); |
26 |
| - set.add(popped); |
27 |
| - List<Integer> list = map.get(popped); |
28 |
| - |
29 |
| - for (Integer integer : list) { |
30 |
| - if (!set.contains(integer)) { |
31 |
| - queue.add(integer); |
32 |
| - } |
| 24 | + } |
| 25 | + |
| 26 | + return count; |
| 27 | + } |
| 28 | + |
| 29 | + private void dfsHelper(int idx, Set<Integer> seen, Map<Integer, Set<Integer>> map) { |
| 30 | + Queue<Integer> queue = new LinkedList<>(); |
| 31 | + queue.add(idx); |
| 32 | + |
| 33 | + while (!queue.isEmpty()) { |
| 34 | + int removed = queue.remove(); |
| 35 | + seen.add(removed); |
| 36 | + |
| 37 | + for (int friend : map.getOrDefault(removed, new HashSet<>())) { |
| 38 | + if (!seen.contains(friend)) { |
| 39 | + queue.add(friend); |
33 | 40 | }
|
34 | 41 | }
|
35 |
| - |
36 |
| - count++; |
37 | 42 | }
|
38 |
| - |
39 |
| - return count; |
40 | 43 | }
|
41 | 44 | }
|
0 commit comments