题目描述
https://leetcode.com/problems/subarrays-with-k-different-integers/
给定一个数组 A,求有 k 个不同元素组成的子数组个数。
例如:
1 | Input: A = [1,2,1,2,3], K = 2 |
测试用例
根据题意,数组长度 n 的取值区间为 [1, 20000]
,数组元素取值区间为 [1, n]
,说明最多可能有 n 个不同元素,k 取值区间也是 [1, n]
,需要考虑 k > count(distinct A[i])
的情况。考虑如下测试用例:
1 | // Case 0: k > count(distinct A[i]) |
分析
第一眼看应该是使用滑窗,根据之前的总结滑窗的模板如下
1 | class Solution: |
使用滑窗需要思考两个问题:
- 什么时候滑动 end 指针?
- 什么时候滑动 begin 指针?
经过思考直接求解不好求,我们换个思路:最多包含 k 个不同元素的子数组有多少个?滑窗 + HashMap 是解决这类问题最常用的方案。代码如下:
1 | def atMostKDistinct(A, k): |
记 f(k) 为小于等于 k 个不同元素的子数组个数,则 f(k-1) 为小于等于 k - 1 个不同元素的子数组个数。所以,确切的有 k 个不同元素的子数组个数 = f(k) - f(k-1)。
代码
根据如上分析,完整代码如下:
1 | class Solution: |
在 [begin, end) 区间中,以 A[end-1] 结尾的子数组个数是 end - begin,所以 ans += end - begin
相关题目 - https://leetcode.com/problems/count-number-of-nice-subarrays/