2537 count the number of good subarrays

https://leetcode.com/problems/count-the-number-of-good-subarrays/

滑动窗口one pass,需要注意的是

  1. 统计发生在收缩i的时候,

  2. 收缩的终止条件是dup不再大于k也就是不再满足题意,

  3. 每次统计不是只加1

  4. 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