68
68
69
69
## 解法
70
70
71
- ### 方法一:计数统计
71
+ ### 方法一:哈希表 + 前缀和
72
72
73
- 由于题目中说明同一时刻只有一辆车处于使用状态,因此我们直接模拟每辆车的运行过程,累加时间 。
73
+ 根据题目描述,每一辆垃圾车从房子 $0$ 出发,收集其中一种垃圾,按顺序前进,直到到达该种垃圾最后出现的房子下标为止 。
74
74
75
- 更进一步思考,我们发现,答案的总耗时其实可以分成两部分:
75
+ 因此,我们可以用一个哈希表 $\text{last}$ 记录每种垃圾最后出现的房子下标。我们假设第 $i$ 种垃圾最后一次出现在第 $j$ 个房子,那么第 $i$ 辆车所需要的行驶时间为 $\text{travel} [ 0 ] + \text{travel} [ 1 ] + \cdots + \text{travel} [ j-1 ] $。这可以通过前缀和来计算。我们累计所有车辆的行驶时间,加上每种垃圾的总收集时间,即可得到答案。
76
76
77
- 1 . 所有垃圾的数量,我们遍历 ` garbage ` 中的每一项 ` v ` ,然后累加 ` v.length ` 就能得到;
78
- 1 . 根据每一种垃圾在 ` garbage ` 中最后一次出现的位置 ` i ` ,我们累加 ` travel[0..i) ` 即可。这里可以先算出 ` travel ` 的前缀和。
79
-
80
- 时间复杂度 $O(n)$,其中 $n$ 为垃圾的数量。
77
+ 时间复杂度 $O(n)$,空间复杂度 $O(k)$,其中 $n$ 和 $k$ 分别是垃圾的数量和种类。本题中 $k = 3$。
81
78
82
79
<!-- tabs:start -->
83
80
84
81
``` python
85
82
class Solution :
86
83
def garbageCollection (self , garbage : List[str ], travel : List[int ]) -> int :
87
- ans = 0
88
84
last = {}
85
+ ans = 0
89
86
for i, s in enumerate (garbage):
90
87
ans += len (s)
91
88
for c in s:
92
89
last[c] = i
93
- s = list (accumulate(travel, initial = 0 ))
94
- ans += sum (s[i] for i in last.values())
90
+ ts = 0
91
+ for i, t in enumerate (travel, 1 ):
92
+ ts += t
93
+ ans += sum (ts for j in last.values() if i == j)
95
94
return ans
96
95
```
97
96
98
97
``` java
99
98
class Solution {
100
99
public int garbageCollection (String [] garbage , int [] travel ) {
101
- int [] last = new int [26 ];
102
- int n = garbage. length;
100
+ Map<Character , Integer > last = new HashMap<> (3 );
103
101
int ans = 0 ;
104
- for (int i = 0 ; i < n ; ++ i) {
105
- int k = garbage[i]. length() ;
106
- ans += k ;
107
- for (int j = 0 ; j < k; ++ j ) {
108
- last[garbage[i] . charAt(j) - ' A ' ] = i ;
102
+ for (int i = 0 ; i < garbage . length ; ++ i) {
103
+ String s = garbage[i];
104
+ ans += s . length() ;
105
+ for (char c : s . toCharArray() ) {
106
+ last. put(c, i) ;
109
107
}
110
108
}
111
- int m = travel. length;
112
- int [] s = new int [m + 1 ];
113
- for (int i = 0 ; i < m; ++ i) {
114
- s[i + 1 ] = s[i] + travel[i];
115
- }
116
- for (int i : last) {
117
- ans += s[i];
109
+ int ts = 0 ;
110
+ for (int i = 1 ; i <= travel. length; ++ i) {
111
+ ts += travel[i - 1 ];
112
+ for (int j : last. values()) {
113
+ if (i == j) {
114
+ ans += ts;
115
+ }
116
+ }
118
117
}
119
118
return ans;
120
119
}
@@ -125,22 +124,23 @@ class Solution {
125
124
class Solution {
126
125
public:
127
126
int garbageCollection(vector<string >& garbage, vector<int >& travel) {
128
- int n = garbage.size(), m = travel.size();
129
- int last[ 26] {};
127
+ unordered_map<char, int> last;
130
128
int ans = 0;
131
- for (int i = 0; i < n; ++i) {
132
- ans += garbage[ i] .size();
133
- for (char& c : garbage[ i] ) {
134
- last[ c - 'A'] = i;
129
+ for (int i = 0; i < garbage.size(); ++i) {
130
+ auto& s = garbage[ i] ;
131
+ ans += s.size();
132
+ for (char& c : s) {
133
+ last[ c] = i;
135
134
}
136
135
}
137
- int s[ m + 1] ;
138
- s[ 0] = 0;
139
- for (int i = 1; i <= m; ++i) {
140
- s[ i] = s[ i - 1] + travel[ i - 1] ;
141
- }
142
- for (int i : last) {
143
- ans += s[ i] ;
136
+ int ts = 0;
137
+ for (int i = 1; i <= travel.size(); ++i) {
138
+ ts += travel[ i - 1] ;
139
+ for (auto& [ _ , j] : last) {
140
+ if (i == j) {
141
+ ans += ts;
142
+ }
143
+ }
144
144
}
145
145
return ans;
146
146
}
@@ -149,228 +149,99 @@ public:
149
149
150
150
```go
151
151
func garbageCollection(garbage []string, travel []int) (ans int) {
152
- last := [26 ]int{}
152
+ last := map[byte ]int{}
153
153
for i, s := range garbage {
154
154
ans += len(s)
155
- for _, c := range s {
156
- last[c-'A' ] = i
155
+ for j := range s {
156
+ last[s[j] ] = i
157
157
}
158
158
}
159
- s := make([]int, len(travel)+1)
160
- for i, x := range travel {
161
- s[i+1] = s[i] + x
162
- }
163
- for _, i := range last {
164
- ans += s[i]
159
+ ts := 0
160
+ for i := 1; i <= len(travel); i++ {
161
+ ts += travel[i-1]
162
+ for _, j := range last {
163
+ if i == j {
164
+ ans += ts
165
+ }
166
+ }
165
167
}
166
168
return
167
169
}
168
170
```
169
171
170
172
``` ts
171
173
function garbageCollection(garbage : string [], travel : number []): number {
172
- const n = garbage .length ;
173
- const m = travel .length ;
174
+ const last: Map <string , number > = new Map ();
174
175
let ans = 0 ;
175
- const last = new Array ( 26 ). fill ( 0 );
176
- for ( let i = 0 ; i < n ; ++ i ) {
177
- ans += garbage [ i ] .length ;
178
- for (const c of garbage [ i ] ) {
179
- last [ c . charCodeAt ( 0 ) - ' A ' . charCodeAt ( 0 )] = i ;
176
+ for ( let i = 0 ; i < garbage . length ; ++ i ) {
177
+ const s = garbage [ i ];
178
+ ans += s .length ;
179
+ for (const c of s ) {
180
+ last . set ( c , i ) ;
180
181
}
181
182
}
182
- const s = new Array (m + 1 ).fill (0 );
183
- for (let i = 1 ; i <= m ; ++ i ) {
184
- s [i ] = s [i - 1 ] + travel [i - 1 ];
185
- }
186
- for (const i of last ) {
187
- ans += s [i ];
183
+ let ts = 0 ;
184
+ for (let i = 1 ; i <= travel .length ; ++ i ) {
185
+ ts += travel [i - 1 ];
186
+ for (const [_, j] of last ) {
187
+ if (i === j ) {
188
+ ans += ts ;
189
+ }
190
+ }
188
191
}
189
192
return ans ;
190
193
}
191
194
```
192
195
193
196
``` rust
197
+ use std :: collections :: HashMap ;
198
+
194
199
impl Solution {
195
200
pub fn garbage_collection (garbage : Vec <String >, travel : Vec <i32 >) -> i32 {
196
- let n = garbage . len ();
197
- let cs = [ b 'M' , b 'P' , b 'G' ] ;
198
- let mut count = [ 0 , 0 , 0 ];
199
- for s in garbage . iter () {
200
- for c in s . as_bytes () . iter () {
201
- count [ if c == & b 'M' { 0 } else if c == & b 'P' { 1 } else { 2 }] += 1 ;
201
+ let mut last : HashMap < char , usize > = HashMap :: new ();
202
+ let mut ans = 0 ;
203
+ for ( i , s ) in garbage . iter () . enumerate () {
204
+ ans += s . len () as i32 ;
205
+ for c in s . chars () {
206
+ last . insert ( c , i ) ;
202
207
}
203
208
}
204
-
205
- let mut res = 0 ;
206
- for i in 0 .. 3 {
207
- for j in 0 .. n {
208
- let s = & garbage [j ];
209
- for c in s . as_bytes (). iter () {
210
- if c == & cs [i ] {
211
- res += 1 ;
212
- count [i ] -= 1 ;
213
- }
209
+ let mut ts = 0 ;
210
+ for (i , t ) in travel . iter (). enumerate () {
211
+ ts += t ;
212
+ for & j in last . values () {
213
+ if i + 1 == j {
214
+ ans += ts ;
214
215
}
215
- if count [i ] == 0 {
216
- break ;
217
- }
218
-
219
- res += travel [j ];
220
216
}
221
217
}
222
- res
218
+ ans
223
219
}
224
220
}
225
221
```
226
222
227
223
``` cs
228
224
public class Solution {
229
225
public int GarbageCollection (string [] garbage , int [] travel ) {
230
- int len = garbage .Length ;
231
- int res = 0 ;
232
- HashSet < char > s = new HashSet <char >();
233
- for (int i = len - 1 ; i >= 0 ; i -- ) {
234
- foreach (char ch in garbage [i ].ToCharArray ()) {
235
- if (! s .Contains (ch ))
236
- s .Add (ch );
237
- }
238
- res += garbage [i ].Length ;
239
- res += i > 0 ? s .Count * travel [i - 1 ] : 0 ;
240
- }
241
- return res ;
242
- }
243
- }
244
- ```
245
-
246
- <!-- tabs: end -->
247
-
248
- ### 方法二
249
-
250
- <!-- tabs: start -->
251
-
252
- ``` python
253
- class Solution :
254
- def garbageCollection (self , garbage : List[str ], travel : List[int ]) -> int :
255
- def f (x : str ) -> int :
256
- ans = 0
257
- st = 0
258
- for i, s in enumerate (garbage):
259
- if t := s.count(x):
260
- ans += t + st
261
- st = 0
262
- if i < len (travel):
263
- st += travel[i]
264
- return ans
265
-
266
- return f(' M' ) + f(' P' ) + f(' G' )
267
- ```
268
-
269
- ``` java
270
- class Solution {
271
- private String [] garbage;
272
- private int [] travel;
273
-
274
- public int garbageCollection (String [] garbage , int [] travel ) {
275
- this . garbage = garbage;
276
- this . travel = travel;
277
- return f(' M' ) + f(' P' ) + f(' G' );
278
- }
279
-
280
- private int f (char c ) {
226
+ Dictionary < char , int > last = new Dictionary <char , int >();
281
227
int ans = 0 ;
282
- int st = 0 ;
283
- for (int i = 0 ; i < garbage. length; ++ i) {
284
- int cnt = 0 ;
285
- for (int j = 0 ; j < garbage[i]. length(); ++ j) {
286
- if (garbage[i]. charAt(j) == c) {
287
- ++ cnt;
288
- }
289
- }
290
- if (cnt > 0 ) {
291
- ans += cnt + st;
292
- st = 0 ;
293
- }
294
- if (i < travel. length) {
295
- st += travel[i];
228
+ for (int i = 0 ; i < garbage .Length ; ++ i ) {
229
+ ans += garbage [i ].Length ;
230
+ foreach (char c in garbage [i ]) {
231
+ last [c ] = i ;
296
232
}
297
233
}
298
- return ans;
299
- }
300
- }
301
- ```
302
-
303
- ``` cpp
304
- class Solution {
305
- public:
306
- int garbageCollection(vector<string >& garbage, vector<int >& travel) {
307
- auto f = [ &] (char x) {
308
- int ans = 0, st = 0;
309
- for (int i = 0; i < garbage.size(); ++i) {
310
- int cnt = 0;
311
- for (char& c : garbage[ i] ) {
312
- if (c == x) {
313
- ++cnt;
314
- }
315
- }
316
- if (cnt > 0) {
317
- ans += cnt + st;
318
- st = 0;
319
- }
320
- if (i < travel.size()) {
321
- st += travel[ i] ;
322
- }
323
- }
324
- return ans;
325
- };
326
- return f('M') + f('P') + f('G');
327
- }
328
- };
329
- ```
330
-
331
- ```go
332
- func garbageCollection(garbage []string, travel []int) (ans int) {
333
- f := func(x rune) int {
334
- ans, st := 0, 0
335
- for i, s := range garbage {
336
- cnt := strings.Count(s, string(x))
337
- if cnt > 0 {
338
- ans += cnt + st
339
- st = 0
340
- }
341
- if i < len(travel) {
342
- st += travel[i]
343
- }
344
- }
345
- return ans
346
- }
347
- return f('M') + f('P') + f('G')
348
- }
349
- ```
350
-
351
- ``` ts
352
- function garbageCollection(garbage : string [], travel : number []): number {
353
- const f = (x : string ) => {
354
- let ans = 0 ;
355
- let st = 0 ;
356
- for (let i = 0 ; i < garbage .length ; ++ i ) {
357
- let cnt = 0 ;
358
- for (const c of garbage [i ]) {
359
- if (c === x ) {
360
- ++ cnt ;
234
+ int ts = 0 ;
235
+ for (int i = 1 ; i <= travel .Length ; ++ i ) {
236
+ ts += travel [i - 1 ];
237
+ foreach (int j in last .Values ) {
238
+ if (i == j ) {
239
+ ans += ts ;
361
240
}
362
241
}
363
- if (cnt > 0 ) {
364
- ans += cnt + st ;
365
- st = 0 ;
366
- }
367
- if (i < travel .length ) {
368
- st += travel [i ];
369
- }
370
242
}
371
243
return ans ;
372
- };
373
- return f (' M' ) + f (' P' ) + f (' G' );
244
+ }
374
245
}
375
246
```
376
247
0 commit comments