题目:
小A认为如果在数组中有一个数出现了至少k次
且这个数是该数组的众数,即出现次数最多的数之一
那么这个数组被该数所支配
显然当k比较大的时候,有些数组不被任何数所支配
现在小A拥有一个长度为n的数组
她想知道内部有多少个区间是被某个数支配的
2 <= k <= n <= 100000
1 <= 数组的值 <= n
思路:
遍历子数组,统计每个数出现的次数,只要有一个数出现至少k次,则认为当前子数组被某个数支配。这种连续的子数组遍历问题,可以用滑动窗口,因为滑动窗口遍历连续的子数组时间复杂度为O(n)。滑动窗口,当窗口内的数组被窗口内的最后一个数支配(之前位置的数都不支配该数组),那么之后的子数组都被某个数支配。此时移动窗口左边界,如果窗口右边界的数支配数组,则窗口内的数组,及窗口右侧的数组也都被某个数支配。即移动窗口,当窗口内的数组被某个数支配,则窗口右边的子数组都被支配。
代码:
int subArrayByMode(vector<int> & arr, int k) {
int n = (int)arr.size();
int right = 0,ans = 0;
unordered_map<int, int> uoMap;
for(int i = 0;i < n;i++) {
while (right < n && uoMap[arr[right]] + 1 < k) {
uoMap[arr[right]]++;
right++;
}
ans += n - right;
uoMap[arr[i]]--;
}
return ans;
}