题目大意:找出数组中出现频率最高的数所在的子数组的最小长度
分析:数据结构的考察。我们需要记录每个数第一次和最后一次出现的位置,如果在这两个位置之间数字出现次数等于原数组最高频数字的出现次数,那么这就找到了一个候选子数组,也就是说最终答案就是候选子数组中最短的一个。
代码:
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
unordered_map<int,int> freq;
unordered_map<int,int> left;
unordered_map<int,int> right;
int maxFreq = 0;
int minLen = nums.size();
for(int i = 0;i < nums.size();i++){
if(left.find(nums[i]) == left.end()) left[nums[i]] = i;
right[nums[i]] = i;
freq[nums[i]]++;
if(freq[nums[i]] > maxFreq){
maxFreq = freq[nums[i]];
minLen = right[nums[i]] - left[nums[i]] + 1;
}
else if(freq[nums[i]] == maxFreq){
minLen = min(minLen,right[nums[i]] - left[nums[i]] + 1);
}
}
return minLen;
}
};