2808. 使循环数组所有元素相等的最少秒数
思路:可以理解为扩散问题,本题数组最终的状态就是某个数。那么我们可以记录数组nums中每个数出现的下标,形成一个下标数组,这里用哈希表mp实现。然后遍历每一个出现的数,找到这些数的下标之间间距的最大值maxx,然后保留最小的一个ans,最后答案就是ans/2。
这里是环状的,那么我们在每个数的下标数组最后面再插入“n+第一个下标的位置”即可
class Solution {
public:
int minimumSeconds(vector<int>& nums) {
int n=nums.size();
unordered_map<int ,vector<int>> mp;
for(int i=0;i<n;i++)
mp[nums[i]].push_back(i);
int ans=n;
for(auto [_,a]:mp){
int maxx=n+a[0]-a.back();
for(int i=1;i<a.size();i++){
maxx=max(maxx,a[i]-a[i-1]);
}
ans=min(ans,maxx);
}
return ans/2;
}
};