假设我们有一个称为nums的非负整数数组,该数组的次数实际上就是其任何元素的最大频率。我们必须找到连续的子数组num的最小可能长度,该子数组与num的度数相同。
因此,如果输入类似于[1,2,2,3,1],则输出将为2,这是因为输入数组的次数为2,因为元素1和2都出现了两次。具有相同度数的子数组-[1、2、2、3、1],[1、2、2、3],[2、2、3、1],[1、2、2],[2 ,2,3],[2,2]最短的长度是2。因此答案将是2。
为了解决这个问题,我们将遵循以下步骤-
定义大小为50000的数组频率,并用0填充
max_:= 0
每n个数字
(将freq [n]增加1)
max_:= max_和freq [n]的最大值
用0填充freq数组。
min_:= nums的大小
对于初始化i:= 0,j:= -1,size:= nums的大小,当j <size时,执行-
从循环中出来
将j增加1
将freq [nums [j]]增加1
min_:= min_和j的最小值-i + 1
如果j> = 0并且freq [nums [j]]与max_相同,则-
否则,当j <size-1时,则-
除此以外
返回min_
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int findShortestSubArray(vector<int>& nums) { vector<int> freq(50000, 0); int max_ = 0; for (const int n : nums) max_ = max(max_, ++freq[n]); fill(freq.begin(), freq.end(), 0); int min_ = nums.size(); for (int i = 0, j = -1, size = nums.size(); j < size;) { if (j >= 0 && freq[nums[j]] == max_) min_ = min(min_, j - i + 1), --freq[nums[i++]]; else if (j < size - 1) ++freq[nums[++j]]; else break; } return min_; } }; main(){ Solution ob; vector<int> v = {1, 2, 2, 3, 1}; cout << (ob.findShortestSubArray(v)); }
{1, 2, 2, 3, 1}
输出结果
2