2799. 统计完全子数组的数目
思路:先用集合set统计出数组中数的种类数ans,然后遍历右端点i,通过哈希表来记录当前区间[j,i]的元素个数以及种类数。细节看注释
class Solution {
public:
int countCompleteSubarrays(vector<int>& nums) {
unordered_map<int ,int> mp;
unordered_set<int> st;
//统计出种类数
int ans=0;
int n=nums.size();
for(int i=0;i<n;i++){
st.insert(nums[i]);
}
ans=st.size();
int cnt=0;
st.clear();
//遍历右端点i,来找到以右端点结尾的区间数
for(int i=0,j=0;i<n;i++){
st.insert(nums[i]);
mp[nums[i]]++;
while(mp[nums[j]]>1){
mp[nums[j]]--;
j++;
}
if(st.size()==ans){
cnt=cnt+j+1;
}
}
return cnt;
}
};
上面是用集合st计数,其实通过哈希表mp也可以计数。
class Solution {
public:
int countCompleteSubarrays(vector<int>& nums) {
unordered_map<int ,int> mp;
unordered_set<int> st;
int ans=0;
int n=nums.size();
for(int i=0;i<n;i++){
st.insert(nums[i]);
}
ans=st.size();
int cnt=0;
for(int i=0,j=0;i<n;i++){
mp[nums[i]]++;
while(mp[nums[j]]>1){
mp[nums[j]]--;
j++;
}
if(mp.size()==ans){
cnt=cnt+j+1;
}
}
return cnt;
}
};