给你一个由 正 整数组成的数组 nums 。
如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :
子数组中 不同 元素的数目等于整个数组不同元素的数目。
返回数组中 完全子数组 的数目。
子数组 是数组中的一个连续非空序列。
示例 1:
输入:nums = [1,3,1,2,2]
输出:4
解释:完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2] 。
示例 2:
输入:nums = [5,5,5,5]
输出:10
解释:数组仅由整数 5 组成,所以任意子数组都满足完全子数组的条件。子数组的总数为 10 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 2000
滑动窗口,窗口内的元素符合完全子数组的数目时,加上窗口左边的元素的子数组也是完全子数组:
class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {unordered_set<int> setNum(nums.begin(), nums.end());int wholeDiffNum = setNum.size();int curDiffNum = 0;unordered_map<int, int> cnt;int left = 0;int ans = 0;for (int i = 0; i < nums.size(); ++i) {if (++cnt[nums[i]] == 1) {++curDiffNum;}while (curDiffNum == wholeDiffNum) {if (--cnt[nums[left]] == 0) {--curDiffNum;}++left;}ans += left;}return ans;}
};
如果输入数组的大小为n,数组中的元素种类数为m,则此算法时间复杂度为O(n),空间复杂度为O(m)。