【LeetCode-992】K 个不同整数的子数组
问题
给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定不同的子数组为好子数组。
(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。)
返回 A 中好子数组的数目。
提示:
- 1 <= A.length <= 20000
- 1 <= A[i] <= A.length
- 1 <= K <= A.length
示例
输入: A = [1,2,1,3,4], K = 3
输出: 3
解释: 恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].
解答
class Solution {
public:
int subarraysWithKDistinct(vector<int>& nums, int k) {
return atMost(nums, k) - atMost(nums, k - 1);
}
private:
int atMost(vector<int>& nums, int k) {
int res = 0, n = nums.size(), l = 0, r = 0;
int memo[n + 1]; bzero(memo, sizeof memo);
while (r < n) {
if (memo[nums[r++]]++ == 0) k--;
while (k < 0)
if (memo[nums[l++]]-- == 1) k++;
res += r - l;
}
return res;
}
};
重点思路
本题需要求解所有包含k种不同数字的子数组。转换为atMost
问题,则答案为“至少包含k种数字的数组数量”减去“至少包含k - 1种数字的数组数量”。