Skip to content

Commit 9aed236

Browse files
authored
feat: update solutions to lc problems: No.2391,2960 (#2777)
* No.2391.Minimum Amount of Time to Collect Garbage * No.2960.Count Tested Devices After Test Operations
1 parent 133f7e1 commit 9aed236

22 files changed

+322
-676
lines changed

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

+89-218
Original file line numberDiff line numberDiff line change
@@ -68,53 +68,52 @@
6868

6969
## 解法
7070

71-
### 方法一:计数统计
71+
### 方法一:哈希表 + 前缀和
7272

73-
由于题目中说明同一时刻只有一辆车处于使用状态,因此我们直接模拟每辆车的运行过程,累加时间
73+
根据题目描述,每一辆垃圾车从房子 $0$ 出发,收集其中一种垃圾,按顺序前进,直到到达该种垃圾最后出现的房子下标为止
7474

75-
更进一步思考,我们发现,答案的总耗时其实可以分成两部分:
75+
因此,我们可以用一个哈希表 $\text{last}$ 记录每种垃圾最后出现的房子下标。我们假设第 $i$ 种垃圾最后一次出现在第 $j$ 个房子,那么第 $i$ 辆车所需要的行驶时间为 $\text{travel}[0] + \text{travel}[1] + \cdots + \text{travel}[j-1]$。这可以通过前缀和来计算。我们累计所有车辆的行驶时间,加上每种垃圾的总收集时间,即可得到答案。
7676

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$。
8178

8279
<!-- tabs:start -->
8380

8481
```python
8582
class Solution:
8683
def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
87-
ans = 0
8884
last = {}
85+
ans = 0
8986
for i, s in enumerate(garbage):
9087
ans += len(s)
9188
for c in s:
9289
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)
9594
return ans
9695
```
9796

9897
```java
9998
class Solution {
10099
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);
103101
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);
109107
}
110108
}
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+
}
118117
}
119118
return ans;
120119
}
@@ -125,22 +124,23 @@ class Solution {
125124
class Solution {
126125
public:
127126
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;
130128
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;
135134
}
136135
}
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+
}
144144
}
145145
return ans;
146146
}
@@ -149,228 +149,99 @@ public:
149149
150150
```go
151151
func garbageCollection(garbage []string, travel []int) (ans int) {
152-
last := [26]int{}
152+
last := map[byte]int{}
153153
for i, s := range garbage {
154154
ans += len(s)
155-
for _, c := range s {
156-
last[c-'A'] = i
155+
for j := range s {
156+
last[s[j]] = i
157157
}
158158
}
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+
}
165167
}
166168
return
167169
}
168170
```
169171

170172
```ts
171173
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();
174175
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);
180181
}
181182
}
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+
}
188191
}
189192
return ans;
190193
}
191194
```
192195

193196
```rust
197+
use std::collections::HashMap;
198+
194199
impl Solution {
195200
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);
202207
}
203208
}
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;
214215
}
215-
if count[i] == 0 {
216-
break;
217-
}
218-
219-
res += travel[j];
220216
}
221217
}
222-
res
218+
ans
223219
}
224220
}
225221
```
226222

227223
```cs
228224
public class Solution {
229225
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>();
281227
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;
296232
}
297233
}
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;
361240
}
362241
}
363-
if (cnt > 0) {
364-
ans += cnt + st;
365-
st = 0;
366-
}
367-
if (i < travel.length) {
368-
st += travel[i];
369-
}
370242
}
371243
return ans;
372-
};
373-
return f('M') + f('P') + f('G');
244+
}
374245
}
375246
```
376247

0 commit comments

Comments
 (0)