@@ -56,22 +56,131 @@ There are no cycles of length 3.
56
56
57
57
<!-- 这里可写通用的实现逻辑 -->
58
58
59
+ ** 方法一:哈希表**
60
+
61
+ 长度为 ` 3 ` 的环,由三个顶点、三条边组成。我们假设三个顶点分别为 ` a ` , ` b ` , ` c ` 。
62
+
63
+ 那么一定存在 ` c <=> a ` ,` c <=> b ` 以及 ` a <=> b ` ,即环中的每个点都与其他两点直接相连。我们可以用哈希表来存放每个点的相邻点。
64
+
65
+ 由于环的长度为 ` 3 ` ,每个相同的环会被重复统计 ` 3 ` 次,因此答案需除以 ` 3 ` 。
66
+
67
+ 时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。
68
+
59
69
<!-- tabs:start -->
60
70
61
71
### ** Python3**
62
72
63
73
<!-- 这里可写当前语言的特殊实现逻辑 -->
64
74
65
75
``` python
66
-
76
+ class Solution :
77
+ def numberOfPaths (self , n : int , corridors : List[List[int ]]) -> int :
78
+ g = defaultdict(set )
79
+ for a, b in corridors:
80
+ g[a].add(b)
81
+ g[b].add(a)
82
+ ans = 0
83
+ for i in range (1 , n + 1 ):
84
+ for j, k in combinations(g[i], 2 ):
85
+ if j in g[k]:
86
+ ans += 1
87
+ return ans // 3
67
88
```
68
89
69
90
### ** Java**
70
91
71
92
<!-- 这里可写当前语言的特殊实现逻辑 -->
72
93
73
94
``` java
95
+ class Solution {
96
+ public int numberOfPaths (int n , int [][] corridors ) {
97
+ Set<Integer > [] g = new Set [n + 1 ];
98
+ for (int i = 0 ; i <= n; ++ i) {
99
+ g[i] = new HashSet<> ();
100
+ }
101
+ for (var c : corridors) {
102
+ int a = c[0 ], b = c[1 ];
103
+ g[a]. add(b);
104
+ g[b]. add(a);
105
+ }
106
+ int ans = 0 ;
107
+ for (int c = 1 ; c <= n; ++ c) {
108
+ var nxt = new ArrayList<> (g[c]);
109
+ int m = nxt. size();
110
+ for (int i = 0 ; i < m; ++ i) {
111
+ for (int j = i + 1 ; j < m; ++ j) {
112
+ int a = nxt. get(i), b = nxt. get(j);
113
+ if (g[b]. contains(a)) {
114
+ ++ ans;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return ans / 3 ;
120
+ }
121
+ }
122
+ ```
123
+
124
+ ### ** C++**
125
+
126
+ ``` cpp
127
+ class Solution {
128
+ public:
129
+ int numberOfPaths(int n, vector<vector<int >>& corridors) {
130
+ vector<unordered_set<int >> g(n + 1);
131
+ for (auto& c : corridors) {
132
+ int a = c[ 0] , b = c[ 1] ;
133
+ g[ a] .insert(b);
134
+ g[ b] .insert(a);
135
+ }
136
+ int ans = 0;
137
+ for (int c = 1; c <= n; ++c) {
138
+ vector<int > nxt;
139
+ nxt.assign(g[ c] .begin(), g[ c] .end());
140
+ int m = nxt.size();
141
+ for (int i = 0; i < m; ++i) {
142
+ for (int j = i + 1; j < m; ++j) {
143
+ int a = nxt[ i] , b = nxt[ j] ;
144
+ ans += g[ b] .count(a);
145
+ }
146
+ }
147
+ }
148
+ return ans / 3;
149
+ }
150
+ };
151
+ ```
74
152
153
+ ### **Go**
154
+
155
+ ```go
156
+ func numberOfPaths(n int, corridors [][]int) int {
157
+ g := make([]map[int]bool, n+1)
158
+ for i := range g {
159
+ g[i] = make(map[int]bool)
160
+ }
161
+ for _, c := range corridors {
162
+ a, b := c[0], c[1]
163
+ g[a][b] = true
164
+ g[b][a] = true
165
+ }
166
+ ans := 0
167
+ for c := 1; c <= n; c++ {
168
+ nxt := []int{}
169
+ for v := range g[c] {
170
+ nxt = append(nxt, v)
171
+ }
172
+ m := len(nxt)
173
+ for i := 0; i < m; i++ {
174
+ for j := i + 1; j < m; j++ {
175
+ a, b := nxt[i], nxt[j]
176
+ if g[b][a] {
177
+ ans++
178
+ }
179
+ }
180
+ }
181
+ }
182
+ return ans / 3
183
+ }
75
184
```
76
185
77
186
### ** ...**
0 commit comments