@@ -57,9 +57,13 @@ answer[7] = 7,
57
57
58
58
<!-- 这里可写通用的实现逻辑 -->
59
59
60
- 根据 richer 关系构建有向图,如果 a 比 b 有钱,那么连一条从 b 到 a 的有向边,最终构建出一个有向无环图。
60
+ ** 方法一:DFS **
61
61
62
- 我们知道,从图的任一点 i 出发,沿着有向边所能访问到的点,都比 i 更有钱。DFS 深搜即可。
62
+ 我们先用邻接表 $g$ 存储 $richer$ 数组中的信息,其中 $g[ i] $ 表示所有比 $i$ 更有钱的人的集合。
63
+
64
+ 然后对于每个人 $i$,我们用 DFS 遍历所有比 $i$ 更有钱的人,找到其中安静值最小的人,即为答案。
65
+
66
+ 时间复杂度 $O(m + n)$,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为 $richer$ 数组和 $quiet$ 数组的长度。
63
67
64
68
<!-- tabs:start -->
65
69
@@ -70,13 +74,7 @@ answer[7] = 7,
70
74
``` python
71
75
class Solution :
72
76
def loudAndRich (self , richer : List[List[int ]], quiet : List[int ]) -> List[int ]:
73
- n = len (quiet)
74
- g = defaultdict(list )
75
- for a, b in richer:
76
- g[b].append(a)
77
- ans = [- 1 ] * n
78
-
79
- def dfs (i ):
77
+ def dfs (i : int ):
80
78
if ans[i] != - 1 :
81
79
return
82
80
ans[i] = i
@@ -85,6 +83,11 @@ class Solution:
85
83
if quiet[ans[j]] < quiet[ans[i]]:
86
84
ans[i] = ans[j]
87
85
86
+ g = defaultdict(list )
87
+ for a, b in richer:
88
+ g[b].append(a)
89
+ n = len (quiet)
90
+ ans = [- 1 ] * n
88
91
for i in range (n):
89
92
dfs(i)
90
93
return ans
@@ -96,19 +99,22 @@ class Solution:
96
99
97
100
``` java
98
101
class Solution {
99
- private Map<Integer , List<Integer > > g;
102
+ private List<Integer > [] g;
103
+ private int n;
100
104
private int [] quiet;
101
105
private int [] ans;
102
106
103
107
public int [] loudAndRich (int [][] richer , int [] quiet ) {
104
- g = new HashMap<> () ;
108
+ n = quiet . length ;
105
109
this . quiet = quiet;
106
- ans = new int [quiet. length];
110
+ g = new List [n];
111
+ ans = new int [n];
107
112
Arrays . fill(ans, - 1 );
108
- for (int [] r : richer) {
109
- g. computeIfAbsent(r[1 ], k - > new ArrayList<> ()). add(r[0 ]);
113
+ Arrays . setAll(g, k - > new ArrayList<> ());
114
+ for (var r : richer) {
115
+ g[r[1 ]]. add(r[0 ]);
110
116
}
111
- for (int i = 0 ; i < quiet . length ; ++ i) {
117
+ for (int i = 0 ; i < n ; ++ i) {
112
118
dfs(i);
113
119
}
114
120
return ans;
@@ -119,10 +125,7 @@ class Solution {
119
125
return ;
120
126
}
121
127
ans[i] = i;
122
- if (! g. containsKey(i)) {
123
- return ;
124
- }
125
- for (int j : g. get(i)) {
128
+ for (int j : g[i]) {
126
129
dfs(j);
127
130
if (quiet[ans[j]] < quiet[ans[i]]) {
128
131
ans[i] = ans[j];
@@ -140,18 +143,25 @@ public:
140
143
vector<int > loudAndRich(vector<vector<int >>& richer, vector<int >& quiet) {
141
144
int n = quiet.size();
142
145
vector<vector<int >> g(n);
143
- for (auto& r : richer) g[ r[ 1]] .push_back(r[ 0] );
146
+ for (auto& r : richer) {
147
+ g[ r[ 1]] .push_back(r[ 0] );
148
+ }
144
149
vector<int > ans(n, -1);
145
150
function<void(int)> dfs = [ &] (int i) {
146
- if (ans[ i] != -1) return;
151
+ if (ans[ i] != -1) {
152
+ return;
153
+ }
147
154
ans[ i] = i;
148
155
for (int j : g[ i] ) {
149
156
dfs(j);
150
- if (quiet[ ans[ j]] < quiet[ ans[ i]] ) ans[ i] = ans[ j] ;
157
+ if (quiet[ ans[ j]] < quiet[ ans[ i]] ) {
158
+ ans[ i] = ans[ j] ;
159
+ }
151
160
}
152
161
};
153
- for (int i = 0; i < n; ++i)
162
+ for (int i = 0; i < n; ++i) {
154
163
dfs(i);
164
+ }
155
165
return ans;
156
166
}
157
167
};
@@ -161,35 +171,62 @@ public:
161
171
162
172
```go
163
173
func loudAndRich(richer [][]int, quiet []int) []int {
164
- n := len(quiet)
165
- ans := make([]int, n)
166
- g := make([][]int, n)
167
- for i := 0; i < n; i++ {
168
- ans[i] = -1
169
- g[i] = make([]int, 0)
170
- }
171
- for _, r := range richer {
172
- g[r[1]] = append(g[r[1]], r[0])
173
- }
174
+ n := len(quiet)
175
+ g := make([][]int, n)
176
+ ans := make([]int, n)
177
+ for i := range g {
178
+ ans[i] = -1
179
+ }
180
+ for _, r := range richer {
181
+ a, b := r[0], r[1]
182
+ g[b] = append(g[b], a)
183
+ }
184
+ var dfs func(int)
185
+ dfs = func(i int) {
186
+ if ans[i] != -1 {
187
+ return
188
+ }
189
+ ans[i] = i
190
+ for _, j := range g[i] {
191
+ dfs(j)
192
+ if quiet[ans[j]] < quiet[ans[i]] {
193
+ ans[i] = ans[j]
194
+ }
195
+ }
196
+ }
197
+ for i := range ans {
198
+ dfs(i)
199
+ }
200
+ return ans
201
+ }
202
+ ```
174
203
175
- var dfs func(i int)
176
- dfs = func(i int) {
177
- if ans[i] != - 1 {
178
- return
204
+ ### ** TypeScript**
205
+
206
+ ``` ts
207
+ function loudAndRich(richer : number [][], quiet : number []): number [] {
208
+ const n = quiet .length ;
209
+ const g: number [][] = new Array (n ).fill (0 ).map (() => []);
210
+ for (const [a, b] of richer ) {
211
+ g [b ].push (a );
212
+ }
213
+ const ans: number [] = new Array (n ).fill (- 1 );
214
+ const dfs = (i : number ) => {
215
+ if (ans [i ] != - 1 ) {
216
+ return ans ;
179
217
}
180
- ans[i] = i
181
- for _, j := range g[i] {
182
- dfs(j)
183
- if quiet[ans[j]] < quiet[ans[i]] {
184
- ans[i] = ans[j]
218
+ ans [i ] = i ;
219
+ for ( const j of g [i ]) {
220
+ dfs (j );
221
+ if ( quiet [ans [j ]] < quiet [ans [i ]]) {
222
+ ans [i ] = ans [j ];
185
223
}
186
224
}
225
+ };
226
+ for (let i = 0 ; i < n ; ++ i ) {
227
+ dfs (i );
187
228
}
188
-
189
- for i := 0; i < n; i++ {
190
- dfs(i)
191
- }
192
- return ans
229
+ return ans ;
193
230
}
194
231
```
195
232
0 commit comments