好巧妙。用了 unordered_map<int,vector<int>> mp;
class Solution { public: int findShortestSubArray(vector<int>& nums) { unordered_map<int,vector<int>> mp; for(int i=0;i<nums.size();i++) mp[nums[i]].push_back(i); int degree=0; for(auto it=mp.begin();it!=mp.end();it++) degree=max(degree,int(it->second.size())); int shortest=nums.size(); for(auto it=mp.begin();it!=mp.end();it++) { if(it->second.size()==degree) { shortest=min(shortest,it->second.back()-it->second[0]+1); } }
自己的
class Solution { public: int findShortestSubArray(vector<int>& nums) { //用hash保存degree,再次遍历找到等于max的value 1和2放在一个vector,然后遍历原始数组,把每一个value的初始和最后的差保存与最小进行比较。 //nums={1,1,1,1,2,1}; int len=nums.size(); map<int,int> hash; int max_degree=INT_MIN; for(int i=0;i<=len-1;i++) { hash[nums[i]]++; if(hash[nums[i]]>max_degree) max_degree=hash[nums[i]]; } vector<int> max_value; int min=INT_MAX; for(map<int,int>::iterator it=hash.begin();it!=hash.end();it++) { if(it->second==max_degree) max_value.push_back(it->first); } int j,k; for(int i=0;i<max_value.size();i++) { for(j=0;j<=len-1;j++) { if(nums[j]==max_value[i]) break; } for(k=len-1;k>=0;k--) { if(nums[k]==max_value[i]) break; } min=k-j+1<min?(k-j+1):min; } return min; } };