Leetcode697. Degree of an Array

好巧妙。用了 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;
    }
};

猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80099764