这题想法是首先找到degree,然后分别记录了每个数的起始位置和结束位置,找到符合degree并且长度最短的数对。我的解法缺点是需要数组内的数有范围这样才能把nums[i]当成index。看了其他人的做法也差不多,无非是用特殊的数据结构来隐藏了具体的遍历数值。下次可以用数据结构来改善代码。
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
if(nums.empty())
return 0;
if(nums.size()==1)
return 1;
vector<int> temp(50000,0);
vector<int> start(50000,-1);
vector<int> end(50000,-1);
for(int i=0;i<nums.size();i++){
temp[nums[i]]++;
if(start[nums[i]]==-1){
start[nums[i]]=i;
end[nums[i]]=i;
}
else
end[nums[i]]=i;
}
int value=0;
for(int i=0;i<50000;i++)
value=value>temp[i]?value:temp[i];
int length=50000;
for(int i=0;i<50000;i++){
if(temp[i]==value){
if(end[i]-start[i]<length)
length=end[i]-start[i];
}
}
return length+1;
}
};