-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathclosest-equal-element-queries.cpp
More file actions
33 lines (32 loc) · 1.03 KB
/
closest-equal-element-queries.cpp
File metadata and controls
33 lines (32 loc) · 1.03 KB
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
// Time: O(n)
// Space: O(n)
// hash table
class Solution {
public:
vector<int> solveQueries(vector<int>& nums, vector<int>& queries) {
vector<int> dist(size(nums), size(nums));
unordered_map<int, int> left;
for (int i = 0; i < 2 * size(nums) - 1; ++i) {
const auto& x = nums[i % size(nums)];
if (left.count(x)) {
dist[i % size(nums)] = min(dist[i % size(nums)], i - left[x]);
}
left[x] = i;
}
unordered_map<int, int> right;
for (int i = 2 * size(nums) - 2; i >= 0; --i) {
const auto& x = nums[i % size(nums)];
if (right.count(x)) {
dist[i % size(nums)] = min(dist[i % size(nums)], right[x] - i);
}
right[x] = i;
}
vector<int> result(size(queries), -1);
for (int i = 0; i < size(queries); ++i) {
if (dist[queries[i]] < size(nums)) {
result[i] = dist[queries[i]];
}
}
return result;
}
};