Skip to content

Commit 469105a

Browse files
authored
feat: add Rust solution for lc No.3851 (#5046)
1 parent 26f4347 commit 469105a

8 files changed

Lines changed: 236 additions & 167 deletions

File tree

solution/3800-3899/3851.Maximum Requests Without Violating the Limit/README.md

Lines changed: 82 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3800-3899/3851.Ma
9494

9595
我们可以将请求按照用户进行分组,放在哈希表 $g$ 中,其中 $g[u]$ 是用户 $u$ 的请求时间列表。对于每个用户,我们需要从请求时间列表中删除一些请求,使得在任意长度为 $window$ 的区间内,剩余的请求数不超过 $k$。
9696

97-
对于用户 $u$ 的请求时间列表 $g[u]$,我们首先对其进行排序。然后,我们使用一个双端队列 $kept$ 来维护当前保留的请求时间。我们遍历请求时间列表中的每个请求时间 $t$,对于每个请求时间,我们需要将 $kept$ 中所有与 $t$ 的差值大于 $window$ 的请求时间删除掉。然后,我们将 $t$ 添加到 $kept$ 中。如果此时 $kept$ 中的请求数超过了 $k$,我们需要删除掉 $kept$ 中的最后一个请求时间,并增加删除的请求数。最后,我们将用户 $u$ 的请求数减去删除的请求数,累加到答案中。
97+
我们初始化答案 $\textit{ans}$ 为请求的总数。
98+
99+
对于用户 $u$ 的请求时间列表 $g[u]$,我们首先对其进行排序。然后,我们使用一个双端队列 $kept$ 来维护当前保留的请求时间。我们遍历请求时间列表中的每个请求时间 $t$,对于每个请求时间,我们需要将 $kept$ 中所有与 $t$ 的差值大于 $window$ 的请求时间删除掉。然后,如果 $kept$ 中剩余的请求数小于 $k$,我们就将 $t$ 添加到 $kept$ 中,否则我们需要删除 $t$,并将答案减 1。
100+
101+
最后返回答案 $\textit{ans}$。
98102

99103
时间复杂度 $O(n \log n)$,空间复杂度 $O(n)$,其中 $n$ 是请求的数量。每个请求被访问一次,排序需要 $O(n \log n)$ 的时间,哈希表和双端队列的操作需要 $O(n)$ 的时间。
100104

@@ -108,19 +112,17 @@ class Solution:
108112
g = defaultdict(list)
109113
for u, t in requests:
110114
g[u].append(t)
111-
ans = 0
115+
ans = len(requests)
112116
for ts in g.values():
113117
ts.sort()
114118
kept = deque()
115-
deletions = 0
116119
for t in ts:
117120
while kept and t - kept[0] > window:
118121
kept.popleft()
119-
kept.append(t)
120-
if len(kept) > k:
121-
kept.pop()
122-
deletions += 1
123-
ans += len(ts) - deletions
122+
if len(kept) < k:
123+
kept.append(t)
124+
else:
125+
ans -= 1
124126
return ans
125127
```
126128

@@ -135,25 +137,22 @@ class Solution {
135137
g.computeIfAbsent(u, x -> new ArrayList<>()).add(t);
136138
}
137139

138-
int ans = 0;
140+
int ans = requests.length;
139141
ArrayDeque<Integer> kept = new ArrayDeque<>();
140142

141143
for (List<Integer> ts : g.values()) {
142144
Collections.sort(ts);
143145
kept.clear();
144-
int deletions = 0;
145-
146146
for (int t : ts) {
147147
while (!kept.isEmpty() && t - kept.peekFirst() > window) {
148148
kept.pollFirst();
149149
}
150-
kept.addLast(t);
151-
if (kept.size() > k) {
152-
kept.pollLast();
153-
deletions++;
150+
if (kept.size() < k) {
151+
kept.addLast(t);
152+
} else {
153+
--ans;
154154
}
155155
}
156-
ans += ts.size() - deletions;
157156
}
158157
return ans;
159158
}
@@ -167,31 +166,26 @@ class Solution {
167166
public:
168167
int maxRequests(vector<vector<int>>& requests, int k, int window) {
169168
unordered_map<int, vector<int>> g;
170-
g.reserve(requests.size() * 2);
171-
172169
for (auto& r : requests) {
173170
g[r[0]].push_back(r[1]);
174171
}
175172

176-
int ans = 0;
177-
deque<int> kept;
178-
173+
int ans = requests.size();
179174
for (auto& [_, ts] : g) {
180175
sort(ts.begin(), ts.end());
181-
kept.clear();
176+
queue<int> kept;
182177
int deletions = 0;
183178

184179
for (int t : ts) {
185180
while (!kept.empty() && t - kept.front() > window) {
186-
kept.pop_front();
181+
kept.pop();
187182
}
188-
kept.push_back(t);
189-
if (kept.size() > k) {
190-
kept.pop_back();
191-
deletions++;
183+
if (kept.size() < k) {
184+
kept.push(t);
185+
} else {
186+
ans--;
192187
}
193188
}
194-
ans += ts.size() - deletions;
195189
}
196190
return ans;
197191
}
@@ -201,33 +195,28 @@ public:
201195
#### Go
202196

203197
```go
204-
func maxRequests(requests [][]int, k int, window int) (ans int) {
198+
func maxRequests(requests [][]int, k int, window int) int {
205199
g := make(map[int][]int)
206200
for _, r := range requests {
207201
u, t := r[0], r[1]
208202
g[u] = append(g[u], t)
209203
}
204+
ans := len(requests)
210205
for _, ts := range g {
211206
sort.Ints(ts)
212-
213207
kept := make([]int, 0)
214-
head := 0
215-
deletions := 0
216-
217208
for _, t := range ts {
218-
for head < len(kept) && t-kept[head] > window {
219-
head++
209+
for len(kept) > 0 && t-kept[0] > window {
210+
kept = kept[1:]
220211
}
221-
kept = append(kept, t)
222-
if len(kept)-head > k {
223-
kept = kept[:len(kept)-1]
224-
deletions++
212+
if len(kept) < k {
213+
kept = append(kept, t)
214+
} else {
215+
ans--
225216
}
226217
}
227-
228-
ans += len(ts) - deletions
229218
}
230-
return
219+
return ans
231220
}
232221
```
233222

@@ -240,32 +229,69 @@ function maxRequests(requests: number[][], k: number, window: number): number {
240229
if (!g.has(u)) g.set(u, []);
241230
g.get(u)!.push(t);
242231
}
243-
244-
let ans = 0;
245-
232+
let ans = requests.length;
246233
for (const ts of g.values()) {
247234
ts.sort((a, b) => a - b);
248-
249235
const kept: number[] = [];
250236
let head = 0;
251-
let deletions = 0;
252-
253237
for (const t of ts) {
254-
while (head < kept.length && t - kept[head] > window) head++;
255-
kept.push(t);
256-
if (kept.length - head > k) {
257-
kept.pop();
258-
deletions++;
238+
while (head < kept.length && t - kept[head] > window) {
239+
head++;
240+
}
241+
if (kept.length - head < k) {
242+
kept.push(t);
243+
} else {
244+
--ans;
259245
}
260246
}
261-
262-
ans += ts.length - deletions;
263247
}
264-
265248
return ans;
266249
}
267250
```
268251

252+
#### Rust
253+
254+
```rust
255+
use std::collections::{HashMap, VecDeque};
256+
257+
impl Solution {
258+
pub fn max_requests(requests: Vec<Vec<i32>>, k: i32, window: i32) -> i32 {
259+
let mut g: HashMap<i32, Vec<i32>> = HashMap::new();
260+
for r in &requests {
261+
let u: i32 = r[0];
262+
let t: i32 = r[1];
263+
g.entry(u).or_insert_with(Vec::new).push(t);
264+
}
265+
266+
let mut ans: i32 = requests.len() as i32;
267+
let mut kept: VecDeque<i32> = VecDeque::new();
268+
269+
for ts in g.values_mut() {
270+
ts.sort();
271+
kept.clear();
272+
273+
for &t in ts.iter() {
274+
while let Some(&front) = kept.front() {
275+
if t - front > window {
276+
kept.pop_front();
277+
} else {
278+
break;
279+
}
280+
}
281+
282+
if kept.len() < k as usize {
283+
kept.push_back(t);
284+
} else {
285+
ans -= 1;
286+
}
287+
}
288+
}
289+
290+
ans
291+
}
292+
}
293+
```
294+
269295
<!-- tabs:end -->
270296

271297
<!-- solution:end -->

0 commit comments

Comments
 (0)