leetcode 之 Degree of an Array

Posted 山里的小勇子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 之 Degree of an Array相关的知识,希望对你有一定的参考价值。

1、题目描述

Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements.  

Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the same degree as nums.

题目是说给定一个非空数组,找出其中出现最多的元素(不只一个),然后返回数组中包含出现最多的元素的最小子数组的长度。

 

2、题目分析

首先使用hash表统计每个元素的出现次数,然后找出每个出现最多的元素放入一个vector中,对vector中每个元素进行统计,找出包含vector中每个元素的最小子数组。

 

3、代码

 1 int findShortestSubArray(vector<int>& nums) {
 2         
 3         unordered_map<int ,int> m;   // 将数组中所有元素放入一个hash_table 中
 4         vector<int> maxItem(0);
 5         int maxindex = 0;
 6         for( auto n : nums )
 7             m[n]++;
 8         
 9         
10         for(auto itr = m.begin(); itr != m.end() ; itr++ )  // 找出出现次数最多的元素,放在一个vector中
11             if(itr->second > maxindex )
12             {
13                 maxItem.clear();
14                 maxItem.push_back(itr->first);
15                 maxindex = itr->second;
16             }
17             else if( itr->second == maxindex )
18             {
19                 maxItem.push_back(itr->first);
20             }
21       
22         
23         int i=0,j= nums.size()-1;     // 对每个出现次数最多的元素进行检查,找出“度”最小的。
24         int ans=nums.size();
25         
26         for(auto itr = maxItem.begin(); itr != maxItem.end(); itr++)
27         {
28             i = 0;j = nums.size()-1;
29             while( nums[i] != *itr ) i++;
30             while(nums[j] != *itr ) j--;
31             ans = min(ans,j-i+1);
32         }
33        
34         return ans;
35     
36     }

 

以上是关于leetcode 之 Degree of an Array的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] Degree of an Array

leetcode-697-Degree of an Array

697. Degree of an Array - LeetCode

[leetcode]Array-697. Degree of an Array

[LeetCode] Degree of an Array 数组的度

leetCode-Degree of an Array