题目链接:https://leetcode-cn.com/problems/degree-of-an-array/
题目介绍
本题思路
题目较为简单,需要满足两个条件:
- 该数出现的次数最多;
- 最后一次出现该数与第一次出现该数的距离最短。
因此,我们在统计数据的时候,只需要统计出每个数的出现次数n,每个数第一次出现的位置left,每个数最后一次出现的位置right。
在这种思路下,采用的最优数据结构为map,键为数值,值为一个数据,分别存储n, left, right。代码如下:
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
unordered_map<int, vector<int>> mp;
int ans = 0, max_i = 0;
for (int i = 0; i<nums.size(); i++){
if(mp.count(nums[i])){
mp[nums[i]][0]++;
mp[nums[i]][2] = i;
}else{
mp[nums[i]] = {1,i,i};
}
}
for (auto& [_, vec]:mp){
if(vec[0] > max_i){
max_i = vec[0];
ans = vec[2]-vec[1]+1;
}else if (vec[0]==max_i){
if(ans > vec[2]-vec[1]+1){
ans = vec[2]-vec[1]+1;
max_i = vec[0];
}
}
}
return ans;
}
};