<leetcode c++> 992. K 个不同整数的子数组
2021-03-03 13:27
标签:leetcode res tor translate -- public com problem 示例 给定一个正整数数组 (例如, 返回 示例 1: 示例 2: 提示: 这道题目乍一看很容易想到滑动窗口的方法, 但是实际上手后发现对于每一次右指针移动,左指针也需要相应的移动,实际造成了O(n^2)的时间复杂度。 需要一个小技巧,把恰好变成最多。 对于最多包含的问题,用活动窗口即有O(n)的解法。 标签:leetcode res tor translate -- public com problem 示例 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14392354.html992. K 个不同整数的子数组
A
,如果 A
的某个子数组中不同整数的个数恰好为 K
,则称 A
的这个连续、不一定独立的子数组为好子数组。[1,2,3,1,2]
中有 3
个不同的整数:1
,2
,以及 3
。)A
中好子数组的数目。输入:A = [1,2,1,2,3], K = 2
输出:7
解释:恰好由 2 个不同整数组成的子数组:[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
输入:A = [1,2,1,3,4], K = 3
输出:3
解释:恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].
1
1
1
class Solution {
public:
int subarraysWithKDistinct(vectorint>& A, int K) {
return func(A, K) - func(A, K - 1);
}
int func(vectorint>& A, int K){
int ans = 0;
int count = 0;
int n = A.size();
vectorint> vis(n + 1, 0);
int l = 0;
for(int r = 0; r ){
if(vis[A[r]] == 0){
++count;
}
++vis[A[r]];
if(count > K){
while(count > K){
vis[A[l]]--;
if(vis[A[l]] == 0)--count;
l++;
}
}
ans += r - l + 1;
}
return ans;
}
};
文章标题:<leetcode c++> 992. K 个不同整数的子数组
文章链接:http://soscw.com/index.php/essay/59530.html