2537 count the number of good subarrays
https://leetcode.com/problems/count-the-number-of-good-subarrays/
滑动窗口one pass,需要注意的是
统计发生在收缩i的时候,
收缩的终止条件是dup不再大于k也就是不再满足题意,
每次统计不是只加1
dup的增加也不是线性的,每增加一个相同的元素,pair数量增加总数减一个
class Solution {
public long countGood(int[] nums, int k) {
long cnt = 0;
int i = 0;
int dup = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int j = 0; j < nums.length; j++) {
map.put(nums[j], map.getOrDefault(nums[j], 0) + 1);
if (map.get(nums[j]) >= 2) {
dup += (map.get(nums[j])-1);
}
while (dup >= k) {
if (dup >= k) cnt += (nums.length - j);
int count = map.get(nums[i]);
if (count == 1) {
map.remove(nums[i]);
} else {
map.put(nums[i], count - 1);
dup -= map.get(nums[i]);
}
i++;
}
}
return cnt;
}
}
Last updated