虽然思路差不多,但是代码值得斟酌
int cnt[50000];
class Solution {
public:
int findShortestSubArray(vector<int>& a) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
memset(cnt, 0, sizeof(cnt));
for (auto &x: a) {
cnt[x]++;
}
int max_time = INT_MIN;
for (auto &x: a) {
max_time = max(max_time, cnt[x]);
}
if (1 == max_time) {
return 1;
}
unordered_map<int,pair<int,int>> rec;
for (int i = 0; i < a.size(); i++) {
const int v = a[i];
if (cnt[v] == max_time) {
auto iter = rec.find(v);
if (iter != rec.end()) {
iter->second.second = i;
} else {
rec.emplace(v, pair<int,int>(i,i));
}
}
}
int min_dist = INT_MAX;
for (auto &p: rec) {
min_dist = min(min_dist, p.second.second - p.second.first);
}
return min_dist + 1;
}
};
我自己的:
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N = nums.size();
if(N <= 1)
return N;
std::map<int, int> early;
std::map<int, int> late;
std::map<int, int> count;
vector<int> maxnum;
int maxcount = INT_MIN;
for(int i=0; i<N; i++){
if(early.find(nums[i]) == early.end())
early[nums[i]] = i;
late[nums[i]] = i;
if(count.find(nums[i]) == count.end()){
count[nums[i]] = 1;
} else {
count[nums[i]] += 1;
}
if(count[nums[i]] == maxcount){
maxnum.push_back(nums[i]);
} else if(count[nums[i]] > maxcount){
maxcount = count[nums[i]];
maxnum.clear();
maxnum.push_back(nums[i]);
}
}
int degree = INT_MAX;
for(auto i: maxnum){
//cout << i<<endl;
if(late[i] - early[i]<degree)
degree = late[i] - early[i];
}
return degree + 1;
}
};