【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目
问题背景
给你一个整数数组 n u m s nums nums 和一个整数 k k k,请你返回 n u m s nums nums 中 好 子数组的数目。
一个子数组 a r r arr arr 如果有 至少 k k k 对下标 ( i , j ) (i, j) (i,j) 满足 i < j i < j i<j 且 a r r [ i ] = a r r [ j ] arr[i] = arr[j] arr[i]=arr[j],那么称它是一个 好 子数组。
子数组 是原数组中一段连续 非空 的元素序列。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1≤nums.length≤105
- 1 ≤ n u m s [ i ] , k ≤ 1 0 9 1 \le nums[i], k \le 10 ^ 9 1≤nums[i],k≤109
解题过程
要求不同的相等数对数量达到某个下限,显然子数组中元素数量越多越有可能满足条件,标准的滑窗。
具体实现
class Solution {public long countGood(int[] nums, int k) {long res = 0;Map<Integer, Integer> map = new HashMap<>();int count = 0;for (int left = 0, right = 0; right < nums.length; right++) {count += map.merge(nums[right], 1, Integer::sum) - 1;while (count >= k) {count -= map.merge(nums[left], -1, Integer::sum);left++;}res += left;}return res;}
}