题目:
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
.
Example 1:
Input: [1, 2, 2, 3, 1] Output: 2 Explanation: The input array has a degree of 2 because both elements 1 and 2 appear twice. Of the subarrays that have the same degree: [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2] The shortest length is 2. So return 2.
Example 2:
Input: [1,2,2,3,1,4,2] Output: 6
Note:
-
nums.length
will be between 1 and 50,000. -
nums[i]
will be an integer between 0 and 49,999.思路:
首先定义一个哈希表,建立每个数字到其所有索引之间的映射。然后找出所有出现次数最多的数字。对于每个数字,计算其对应的最短子串(就是其第一次出现的位置和最后一次出现的位置之间的字符构成的子串)的长度。最后返回所有数字中最短子串的最短长度即可。
代码:
class Solution { public: int findShortestSubArray(vector<int>& nums) { unordered_map<int, vector<int>> hash; // num -> indices int max_frequency = 0; vector<int> max_freq_nums; for (int i = 0; i < nums.size(); ++i) { hash[nums[i]].push_back(i); if (hash[nums[i]].size() > max_frequency) { max_frequency = hash[nums[i]].size(); max_freq_nums.clear(); max_freq_nums.push_back(nums[i]); } else if (hash[nums[i]].size() == max_frequency) { max_freq_nums.push_back(nums[i]); } } int ret = INT_MAX; for (auto num : max_freq_nums) { ret = min(ret, hash[num].back() - *hash[num].begin() + 1); } return ret; } };