給你一個由 正 整數組成的數組 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)。