Skip to content

Commit 88c93c7

Browse files
committed
feat: add solutions to lc problem: No.2391
No.2391.Minimum Amount of Time to Collect Garbage
1 parent ff52610 commit 88c93c7

File tree

7 files changed

+273
-128
lines changed

7 files changed

+273
-128
lines changed

solution/2300-2399/2391.Minimum Amount of Time to Collect Garbage/README.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@
7272

7373
由于题目中说明同一时刻只有一辆车处于使用状态,因此我们直接模拟每辆车的运行过程,累加时间。
7474

75+
更进一步思考,我们发现,答案的总耗时其实可以分成两部分:
76+
77+
1. 所有垃圾的数量,我们遍历 `garbage` 中的每一项 `v`,然后累加 `v.length` 就能得到;
78+
1. 根据每一种垃圾在 `garbage` 中最后一次出现的位置 `i`,我们累加 `travel[0..i)` 即可。这里可以先算出 `travel` 的前缀和。
79+
7580
时间复杂度 $O(n)$,其中 $n$ 为垃圾的数量。
7681

7782
<!-- tabs:start -->
@@ -100,6 +105,20 @@ class Solution:
100105
return f('M') + f('P') + f('G')
101106
```
102107

108+
```python
109+
class Solution:
110+
def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
111+
ans = 0
112+
pos = {}
113+
for i, v in enumerate(garbage):
114+
ans += len(v)
115+
for c in v:
116+
pos[c] = i
117+
s = list(accumulate(travel, initial=0))
118+
ans += sum(s[i] for i in pos.values())
119+
return ans
120+
```
121+
103122
### **Java**
104123

105124
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -146,6 +165,29 @@ class Solution {
146165
}
147166
```
148167

168+
```java
169+
class Solution {
170+
public int garbageCollection(String[] garbage, int[] travel) {
171+
int ans = 0;
172+
int[] pos = new int[26];
173+
for (int i = 0; i < garbage.length; ++i) {
174+
ans += garbage[i].length();
175+
for (char c : garbage[i].toCharArray()) {
176+
pos[c - 'A'] = i;
177+
}
178+
}
179+
int[] s = new int[travel.length + 1];
180+
for (int i = 0; i < travel.length; ++i) {
181+
s[i + 1] = s[i] + travel[i];
182+
}
183+
for (int i : pos) {
184+
ans += s[i];
185+
}
186+
return ans;
187+
}
188+
}
189+
```
190+
149191
### **C++**
150192

151193
```cpp
@@ -183,6 +225,30 @@ public:
183225
};
184226
```
185227
228+
```cpp
229+
class Solution {
230+
public:
231+
int garbageCollection(vector<string>& garbage, vector<int>& travel) {
232+
int ans = 0;
233+
vector<int> pos(26);
234+
for (int i = 0; i < garbage.size(); ++i) {
235+
ans += garbage[i].size();
236+
for (char c : garbage[i]) {
237+
pos[c - 'A'] = i;
238+
}
239+
}
240+
vector<int> s(travel.size() + 1);
241+
for (int i = 0; i < travel.size(); ++i) {
242+
s[i + 1] = s[i] + travel[i];
243+
}
244+
for (int i : pos) {
245+
ans += s[i];
246+
}
247+
return ans;
248+
}
249+
};
250+
```
251+
186252
### **Go**
187253

188254
```go
@@ -220,6 +286,27 @@ func garbageCollection(garbage []string, travel []int) int {
220286
}
221287
```
222288

289+
```go
290+
func garbageCollection(garbage []string, travel []int) int {
291+
ans := 0
292+
pos := map[rune]int{}
293+
for i, v := range garbage {
294+
ans += len(v)
295+
for _, c := range v {
296+
pos[c] = i
297+
}
298+
}
299+
s := make([]int, len(travel)+1)
300+
for i, v := range travel {
301+
s[i+1] = s[i] + v
302+
}
303+
for _, i := range pos {
304+
ans += s[i]
305+
}
306+
return ans
307+
}
308+
```
309+
223310
### **TypeScript**
224311

225312
```ts
@@ -259,6 +346,27 @@ function garbageCollection(garbage: string[], travel: number[]): number {
259346
}
260347
```
261348

349+
```ts
350+
function garbageCollection(garbage: string[], travel: number[]): number {
351+
let ans = 0;
352+
let pos = new Map();
353+
for (let i = 0; i < garbage.length; ++i) {
354+
ans += garbage[i].length;
355+
for (const c of garbage[i]) {
356+
pos.set(c, i);
357+
}
358+
}
359+
let s = new Array(travel.length + 1).fill(0);
360+
for (let i = 0; i < travel.length; ++i) {
361+
s[i + 1] = s[i] + travel[i];
362+
}
363+
for (const [_, i] of pos) {
364+
ans += s[i];
365+
}
366+
return ans;
367+
}
368+
```
369+
262370
### **Rust**
263371

264372
```rust

solution/2300-2399/2391.Minimum Amount of Time to Collect Garbage/README_EN.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,20 @@ class Solution:
8888
return f('M') + f('P') + f('G')
8989
```
9090

91+
```python
92+
class Solution:
93+
def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
94+
ans = 0
95+
pos = {}
96+
for i, v in enumerate(garbage):
97+
ans += len(v)
98+
for c in v:
99+
pos[c] = i
100+
s = list(accumulate(travel, initial=0))
101+
ans += sum(s[i] for i in pos.values())
102+
return ans
103+
```
104+
91105
### **Java**
92106

93107
```java
@@ -132,6 +146,29 @@ class Solution {
132146
}
133147
```
134148

149+
```java
150+
class Solution {
151+
public int garbageCollection(String[] garbage, int[] travel) {
152+
int ans = 0;
153+
int[] pos = new int[26];
154+
for (int i = 0; i < garbage.length; ++i) {
155+
ans += garbage[i].length();
156+
for (char c : garbage[i].toCharArray()) {
157+
pos[c - 'A'] = i;
158+
}
159+
}
160+
int[] s = new int[travel.length + 1];
161+
for (int i = 0; i < travel.length; ++i) {
162+
s[i + 1] = s[i] + travel[i];
163+
}
164+
for (int i : pos) {
165+
ans += s[i];
166+
}
167+
return ans;
168+
}
169+
}
170+
```
171+
135172
### **C++**
136173

137174
```cpp
@@ -169,6 +206,30 @@ public:
169206
};
170207
```
171208
209+
```cpp
210+
class Solution {
211+
public:
212+
int garbageCollection(vector<string>& garbage, vector<int>& travel) {
213+
int ans = 0;
214+
vector<int> pos(26);
215+
for (int i = 0; i < garbage.size(); ++i) {
216+
ans += garbage[i].size();
217+
for (char c : garbage[i]) {
218+
pos[c - 'A'] = i;
219+
}
220+
}
221+
vector<int> s(travel.size() + 1);
222+
for (int i = 0; i < travel.size(); ++i) {
223+
s[i + 1] = s[i] + travel[i];
224+
}
225+
for (int i : pos) {
226+
ans += s[i];
227+
}
228+
return ans;
229+
}
230+
};
231+
```
232+
172233
### **Go**
173234

174235
```go
@@ -206,6 +267,27 @@ func garbageCollection(garbage []string, travel []int) int {
206267
}
207268
```
208269

270+
```go
271+
func garbageCollection(garbage []string, travel []int) int {
272+
ans := 0
273+
pos := map[rune]int{}
274+
for i, v := range garbage {
275+
ans += len(v)
276+
for _, c := range v {
277+
pos[c] = i
278+
}
279+
}
280+
s := make([]int, len(travel)+1)
281+
for i, v := range travel {
282+
s[i+1] = s[i] + v
283+
}
284+
for _, i := range pos {
285+
ans += s[i]
286+
}
287+
return ans
288+
}
289+
```
290+
209291
### **TypeScript**
210292

211293
```ts
@@ -245,6 +327,27 @@ function garbageCollection(garbage: string[], travel: number[]): number {
245327
}
246328
```
247329

330+
```ts
331+
function garbageCollection(garbage: string[], travel: number[]): number {
332+
let ans = 0;
333+
let pos = new Map();
334+
for (let i = 0; i < garbage.length; ++i) {
335+
ans += garbage[i].length;
336+
for (const c of garbage[i]) {
337+
pos.set(c, i);
338+
}
339+
}
340+
let s = new Array(travel.length + 1).fill(0);
341+
for (let i = 0; i < travel.length; ++i) {
342+
s[i + 1] = s[i] + travel[i];
343+
}
344+
for (const [_, i] of pos) {
345+
ans += s[i];
346+
}
347+
return ans;
348+
}
349+
```
350+
248351
### **Rust**
249352

250353
```rust
Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,21 @@
11
class Solution {
22
public:
3-
vector<string> g;
4-
vector<int> travel;
5-
63
int garbageCollection(vector<string>& garbage, vector<int>& travel) {
7-
g = garbage;
8-
this->travel = travel;
9-
return f('M') + f('P') + f('G');
10-
}
11-
12-
int f(char c) {
13-
int tot = 0;
14-
for (string& v : g) {
15-
for (char ch : v) {
16-
tot += ch == c;
4+
int ans = 0;
5+
vector<int> pos(26);
6+
for (int i = 0; i < garbage.size(); ++i) {
7+
ans += garbage[i].size();
8+
for (char c : garbage[i]) {
9+
pos[c - 'A'] = i;
1710
}
1811
}
19-
int res = 0;
20-
for (int i = 0; i < g.size(); ++i) {
21-
int t = 0;
22-
for (char ch : g[i]) {
23-
t += ch == c;
24-
}
25-
res += t;
26-
tot -= t;
27-
if (tot == 0) break;
28-
if (i < g.size() - 1) res += travel[i];
12+
vector<int> s(travel.size() + 1);
13+
for (int i = 0; i < travel.size(); ++i) {
14+
s[i + 1] = s[i] + travel[i];
15+
}
16+
for (int i : pos) {
17+
ans += s[i];
2918
}
30-
return res;
19+
return ans;
3120
}
3221
};
Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,18 @@
11
func garbageCollection(garbage []string, travel []int) int {
2-
n := len(garbage)
3-
f := func(c rune) int {
4-
tot := 0
5-
for _, v := range garbage {
6-
for _, ch := range v {
7-
if ch == c {
8-
tot++
9-
}
10-
}
2+
ans := 0
3+
pos := map[rune]int{}
4+
for i, v := range garbage {
5+
ans += len(v)
6+
for _, c := range v {
7+
pos[c] = i
118
}
12-
res := 0
13-
for i, v := range garbage {
14-
t := 0
15-
for _, ch := range v {
16-
if ch == c {
17-
t++
18-
}
19-
}
20-
res += t
21-
tot -= t
22-
if tot == 0 {
23-
break
24-
}
25-
if i < n-1 {
26-
res += travel[i]
27-
}
28-
}
29-
return res
309
}
31-
return f('M') + f('P') + f('G')
10+
s := make([]int, len(travel)+1)
11+
for i, v := range travel {
12+
s[i+1] = s[i] + v
13+
}
14+
for _, i := range pos {
15+
ans += s[i]
16+
}
17+
return ans
3218
}

0 commit comments

Comments
 (0)