题目链接:2799. 统计完全子数组的数目(中等)
算法原理:
解法:滑动窗口
击败56.50%
时间复杂度O(N)
跟模板题大差不差👇
C.滑动窗口-求子数组个数-越长越合法------1358. 包含所有三种字符的子字符串数目(模板)
①先统计出目标数目:整个数组中不同元素的数目
②进窗口:哈希表中对应值次数+1;
③出窗口:只要键的数目=目标数目就持续出窗口,使left处于恰好不满足的状态
④更新:ret+=left,含义就是枚举每个右端点时,不同的左端点的数目就是能够使窗口内不同元素数目等于整个数组中不同元素的数目的数目
Java代码:
java
class Solution {
public int countCompleteSubarrays(int[] nums) {
int n=nums.length;
//统计整个数组不同元素的个数
Set<Integer> set=new HashSet<>();
for(int x:nums) set.add(x);
//统计<数,出现次数>
Map<Integer,Integer> hash=new HashMap<>();
int left=0,ret=0;
for(int x:nums){
//进窗口
hash.put(x,hash.getOrDefault(x,0)+1);
//出窗口
while(hash.keySet().size()==set.size()){
hash.put(nums[left],hash.get(nums[left])-1);
if(hash.get(nums[left])==0) hash.remove(nums[left]);
left++;
}
//更新
ret+=left;
}
return ret;
}
}