Leetcode-3488距离最小相等元素查询
依旧二分,链接如下3488. 距离最小相等元素查询
看题目是个循环数组,记得当时做过一道什么题也是循环数组,就想着直接数组复制一下,然后跟上一道题一样,用hashmap来存储value的值以及value对应下标的vector。
和灵神的思路类似,都是比较左右元素,不过我没有使用哨兵。
然后比较vector对应的idx到left元素的下标差以及到right元素的下标差,这里很容易出错。昨天debug了好久找不到问题在哪,后来发现是把nums数组的长度和下标所在的vector数组的长度搞混到一起了。最好还是用灵神的做法,我的这种做法太笨重了,容易出错。
C++代码如下
class Solution {
public:vector<int> solveQueries(vector<int>& nums, vector<int>& queries) {int m = nums.size();vector<int> numss = nums;numss.insert(numss.end(),nums.begin(),nums.end());unordered_map<int,vector<int>> hmap;for(int i = 0 ; i < numss.size();i++)hmap[numss[i]].push_back(i);vector<int> ans;for( int i = 0; i<queries.size();i++){auto it = hmap.find(numss[queries[i]]);if(it != hmap.end()&& it->second.size()!=2){auto& s = it->second;int n = s.size()/2;int r = *upper_bound(s.begin(),s.end(),queries[i])-queries[i];int l ;auto l_ptr = lower_bound(s.begin(),s.end(),queries[i]);if(l_ptr == s.begin())l = abs(*--(l_ptr+n)-m-*l_ptr);elsel = abs(*(--l_ptr)-queries[i]);ans.push_back(min(r,l));}elseans.push_back(-1);}return ans;}
};