@@ -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 {
167166public:
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