题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vector<int> solveQueries(vector<int>& nums, vector<int>& queries) {
map<int,vector<int>>mp;
for(int i=0;i<nums.size();++i){
mp[nums[i]].push_back(i);
}
int n = queries.size();
vector<int>ans(n,-1);
for(int j=0;j<n;++j){
int q = queries[j];
auto & vec = mp[nums[q]];
if(vec.size()==1){
continue;
}
int idx = ranges::lower_bound(vec,q)-vec.begin();

ans[j] = min((vec[(idx+1)%vec.size()]-vec[idx]+nums.size())%nums.size(),(vec[idx] - vec[(idx-1+vec.size())%vec.size()]+nums.size())%nums.size());
}
return ans;
}

跟它类似的还有比如981. 基于时间的键值存储

这类题型的本质是:对于某个属性相同的元素,需要在它们的位置序列中进行高效查找。

流程: