3851. Maximum Requests Without Violating the Limit 🔒
题目描述
You are given a 2D integer array requests, where requests[i] = [useri, timei] indicates that useri made a request at timei.
You are also given two integers k and window.
A user violates the limit if there exists an integer t such that the user makes strictly more than k requests in the inclusive interval [t, t + window].
You may drop any number of requests.
Return an integer denoting the maximum number of requests that can remain such that no user violates the limit.
Example 1:
Input: requests = [[1,1],[2,1],[1,7],[2,8]], k = 1, window = 4
Output: 4
Explanation:
- For user 1, the request times are
[1, 7]. The difference between them is 6, which is greater thanwindow = 4. - For user 2, the request times are
[1, 8]. The difference is 7, which is also greater thanwindow = 4. - No user makes more than
k = 1request within any inclusive interval of lengthwindow. Therefore, all 4 requests can remain.
Example 2:
Input: requests = [[1,2],[1,5],[1,2],[1,6]], k = 2, window = 5
Output: 2
Explanation:
- For user 1, the request times are
[2, 2, 5, 6]. The inclusive interval[2, 7]of lengthwindow = 5contains all 4 requests. - Since 4 is strictly greater than
k = 2, at least 2 requests must be removed. - After removing any 2 requests, every inclusive interval of length
windowcontains at mostk = 2requests. - Therefore, the maximum number of requests that can remain is 2.
Example 3:
Input: requests = [[1,1],[2,5],[1,2],[3,9]], k = 1, window = 1
Output: 3
Explanation:
- For user 1, the request times are
[1, 2]. The difference is 1, which is equal towindow = 1. - The inclusive interval
[1, 2]contains both requests, so the count is 2, which exceedsk = 1. One request must be removed. - Users 2 and 3 each have only one request and do not violate the limit. Therefore, the maximum number of requests that can remain is 3.
Constraints:
1 <= requests.length <= 105requests[i] = [useri, timei]1 <= k <= requests.length1 <= useri, timei, window <= 105
解法
方法一:滑动窗口 + 双端队列
我们可以将请求按照用户进行分组,放在哈希表 \(g\) 中,其中 \(g[u]\) 是用户 \(u\) 的请求时间列表。对于每个用户,我们需要从请求时间列表中删除一些请求,使得在任意长度为 \(window\) 的区间内,剩余的请求数不超过 \(k\)。
我们初始化答案 \(\textit{ans}\) 为请求的总数。
对于用户 \(u\) 的请求时间列表 \(g[u]\),我们首先对其进行排序。然后,我们使用一个双端队列 \(kept\) 来维护当前保留的请求时间。我们遍历请求时间列表中的每个请求时间 \(t\),对于每个请求时间,我们需要将 \(kept\) 中所有与 \(t\) 的差值大于 \(window\) 的请求时间删除掉。然后,如果 \(kept\) 中剩余的请求数小于 \(k\),我们就将 \(t\) 添加到 \(kept\) 中,否则我们需要删除 \(t\),并将答案减 1。
最后返回答案 \(\textit{ans}\)。
时间复杂度 \(O(n \log n)\),空间复杂度 \(O(n)\),其中 \(n\) 是请求的数量。每个请求被访问一次,排序需要 \(O(n \log n)\) 的时间,哈希表和双端队列的操作需要 \(O(n)\) 的时间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |