@@ -81,32 +81,253 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3493.Pr
81
81
82
82
<!-- solution:start -->
83
83
84
- ### 方法一
84
+ ### 方法一:哈希表 + DFS
85
+
86
+ 我们先将每个属性数组转换为一个哈希表,存储在哈希表数组 $\textit{ss}$ 中。定义一个图 $\textit{g}$,其中 $\textit{g}[ i] $ 存储了与属性数组 $\textit{properties}[ i] $ 有边相连的属性数组的索引。
87
+
88
+ 然后我们遍历所有的属性哈希表,对于每一对属性哈希表 $(i, j)$,其中 $j < i$,我们检查这两个属性哈希表中的交集元素个数是否大于等于 $k$,如果是,则在图 $\textit{g}$ 中添加一条从 $i$ 到 $j$ 的边,同时在图 $\textit{g}$ 中添加一条从 $j$ 到 $i$ 的边。
89
+
90
+ 最后,我们使用深度优先搜索计算图 $\textit{g}$ 的连通分量的数量。
91
+
92
+ 时间复杂度 $O(n^2 \times m)$,空间复杂度 $O(n \times m)$。其中 $n$ 是属性数组的长度,而 $m$ 是属性数组中的元素个数。
85
93
86
94
<!-- tabs:start -->
87
95
88
96
#### Python3
89
97
90
98
``` python
91
-
99
+ class Solution :
100
+ def numberOfComponents (self , properties : List[List[int ]], k : int ) -> int :
101
+ def dfs (i : int ) -> None :
102
+ vis[i] = True
103
+ for j in g[i]:
104
+ if not vis[j]:
105
+ dfs(j)
106
+
107
+ n = len (properties)
108
+ ss = list (map (set , properties))
109
+ g = [[] for _ in range (n)]
110
+ for i, s1 in enumerate (ss):
111
+ for j in range (i):
112
+ s2 = ss[j]
113
+ if len (s1 & s2) >= k:
114
+ g[i].append(j)
115
+ g[j].append(i)
116
+ ans = 0
117
+ vis = [False ] * n
118
+ for i in range (n):
119
+ if not vis[i]:
120
+ dfs(i)
121
+ ans += 1
122
+ return ans
92
123
```
93
124
94
125
#### Java
95
126
96
127
``` java
97
-
128
+ class Solution {
129
+ private List<Integer > [] g;
130
+ private boolean [] vis;
131
+
132
+ public int numberOfComponents (int [][] properties , int k ) {
133
+ int n = properties. length;
134
+ g = new List [n];
135
+ Set<Integer > [] ss = new Set [n];
136
+ Arrays . setAll(g, i - > new ArrayList<> ());
137
+ Arrays . setAll(ss, i - > new HashSet<> ());
138
+ for (int i = 0 ; i < n; ++ i) {
139
+ for (int x : properties[i]) {
140
+ ss[i]. add(x);
141
+ }
142
+ }
143
+ for (int i = 0 ; i < n; ++ i) {
144
+ for (int j = 0 ; j < i; ++ j) {
145
+ int cnt = 0 ;
146
+ for (int x : ss[i]) {
147
+ if (ss[j]. contains(x)) {
148
+ ++ cnt;
149
+ }
150
+ }
151
+ if (cnt >= k) {
152
+ g[i]. add(j);
153
+ g[j]. add(i);
154
+ }
155
+ }
156
+ }
157
+
158
+ int ans = 0 ;
159
+ vis = new boolean [n];
160
+ for (int i = 0 ; i < n; ++ i) {
161
+ if (! vis[i]) {
162
+ dfs(i);
163
+ ++ ans;
164
+ }
165
+ }
166
+ return ans;
167
+ }
168
+
169
+ private void dfs (int i ) {
170
+ vis[i] = true ;
171
+ for (int j : g[i]) {
172
+ if (! vis[j]) {
173
+ dfs(j);
174
+ }
175
+ }
176
+ }
177
+ }
98
178
```
99
179
100
180
#### C++
101
181
102
182
``` cpp
103
-
183
+ class Solution {
184
+ public:
185
+ int numberOfComponents(vector<vector<int >>& properties, int k) {
186
+ int n = properties.size();
187
+ unordered_set<int > ss[ n] ;
188
+ vector<int > g[ n] ;
189
+ for (int i = 0; i < n; ++i) {
190
+ for (int x : properties[ i] ) {
191
+ ss[ i] .insert(x);
192
+ }
193
+ }
194
+ for (int i = 0; i < n; ++i) {
195
+ auto& s1 = ss[ i] ;
196
+ for (int j = 0; j < i; ++j) {
197
+ auto& s2 = ss[ j] ;
198
+ int cnt = 0;
199
+ for (int x : s1) {
200
+ if (s2.contains(x)) {
201
+ ++cnt;
202
+ }
203
+ }
204
+ if (cnt >= k) {
205
+ g[ i] .push_back(j);
206
+ g[ j] .push_back(i);
207
+ }
208
+ }
209
+ }
210
+ int ans = 0;
211
+ vector<bool > vis(n);
212
+ auto dfs = [ &] (this auto&& dfs, int i) -> void {
213
+ vis[ i] = true;
214
+ for (int j : g[ i] ) {
215
+ if (!vis[ j] ) {
216
+ dfs(j);
217
+ }
218
+ }
219
+ };
220
+ for (int i = 0; i < n; ++i) {
221
+ if (!vis[ i] ) {
222
+ dfs(i);
223
+ ++ans;
224
+ }
225
+ }
226
+ return ans;
227
+ }
228
+ };
104
229
```
105
230
106
231
#### Go
107
232
108
233
```go
234
+ func numberOfComponents(properties [][]int, k int) (ans int) {
235
+ n := len(properties)
236
+ ss := make([]map[int]struct{}, n)
237
+ g := make([][]int, n)
238
+
239
+ for i := 0; i < n; i++ {
240
+ ss[i] = make(map[int]struct{})
241
+ for _, x := range properties[i] {
242
+ ss[i][x] = struct{}{}
243
+ }
244
+ }
245
+
246
+ for i := 0; i < n; i++ {
247
+ for j := 0; j < i; j++ {
248
+ cnt := 0
249
+ for x := range ss[i] {
250
+ if _, ok := ss[j][x]; ok {
251
+ cnt++
252
+ }
253
+ }
254
+ if cnt >= k {
255
+ g[i] = append(g[i], j)
256
+ g[j] = append(g[j], i)
257
+ }
258
+ }
259
+ }
260
+
261
+ vis := make([]bool, n)
262
+ var dfs func(int)
263
+ dfs = func(i int) {
264
+ vis[i] = true
265
+ for _, j := range g[i] {
266
+ if !vis[j] {
267
+ dfs(j)
268
+ }
269
+ }
270
+ }
271
+
272
+ for i := 0; i < n; i++ {
273
+ if !vis[i] {
274
+ dfs(i)
275
+ ans++
276
+ }
277
+ }
278
+ return
279
+ }
280
+ ```
109
281
282
+ #### TypeScript
283
+
284
+ ``` ts
285
+ function numberOfComponents(properties : number [][], k : number ): number {
286
+ const n = properties .length ;
287
+ const ss: Set <number >[] = Array .from ({ length: n }, () => new Set ());
288
+ const g: number [][] = Array .from ({ length: n }, () => []);
289
+
290
+ for (let i = 0 ; i < n ; i ++ ) {
291
+ for (const x of properties [i ]) {
292
+ ss [i ].add (x );
293
+ }
294
+ }
295
+
296
+ for (let i = 0 ; i < n ; i ++ ) {
297
+ for (let j = 0 ; j < i ; j ++ ) {
298
+ let cnt = 0 ;
299
+ for (const x of ss [i ]) {
300
+ if (ss [j ].has (x )) {
301
+ cnt ++ ;
302
+ }
303
+ }
304
+ if (cnt >= k ) {
305
+ g [i ].push (j );
306
+ g [j ].push (i );
307
+ }
308
+ }
309
+ }
310
+
311
+ let ans = 0 ;
312
+ const vis: boolean [] = Array (n ).fill (false );
313
+
314
+ const dfs = (i : number ) => {
315
+ vis [i ] = true ;
316
+ for (const j of g [i ]) {
317
+ if (! vis [j ]) {
318
+ dfs (j );
319
+ }
320
+ }
321
+ };
322
+
323
+ for (let i = 0 ; i < n ; i ++ ) {
324
+ if (! vis [i ]) {
325
+ dfs (i );
326
+ ans ++ ;
327
+ }
328
+ }
329
+ return ans ;
330
+ }
110
331
```
111
332
112
333
<!-- tabs: end -->
0 commit comments