分析
利用两个哈希表,一个表记录出现数组中每个数字出现的次数,同时找到出现次数最大值ans。
之后开一个vetor记录所有出现次数最大值的下标。
之后把每个出现次数最大的数字的下标加入进来。
C++ 代码
class Solution {
public:
unordered_map<int,int> mp1,mp2;
int ans=-1,cnt,n,idx,res=INT_MAX;
int findShortestSubArray(vector<int>& nums) {
for(auto x:nums)
{
mp1[x]++;
if(ans<mp1[x]) //当前数字出现次数大于ans,更新最大值
{
cnt=1;
ans=mp1[x];
}
if(ans==mp1[x]) cnt++;
}
vector<int> v[cnt+1]; //开一个vetor记录所有出现次数最大值的下标
int n=nums.size();
for(int i=0;i<n;i++)
{
if(mp1[nums[i]]==ans) //当前数字出现次数为ans
{
if(!mp2.count(nums[i]))
{
mp2[nums[i]]=idx++;
}
v[mp2[nums[i]]].push_back(i); //把该下标加入进去
if(v[mp2[nums[i]]].size()==ans) //下标总数达到ans
{
res=min(res,v[mp2[nums[i]]].back()-v[mp2[nums[i]]][0]+1); 更新最小数组长度res
}
}
}
return res;
}
};