好久没有遇见这一类题目了,记得很早之前遇到过一次,倒是完全忘了解法。
求整好k个情况下的答案,可以转换成求小于k和小于k-1的方法。
如果不用调用两次这个方案,按习惯我会写三个指针,一个是初始,一个是刚好等于k-1的位置,一个是等于k的位置,但是那样好像有点麻烦,不如牺牲一下时间了。
class Solution {
public:
int subarraysWithLessthanKDistinct(vector<int>& A, int K)
{
int existNums[30000];
memset(existNums, 0, sizeof(existNums));
int curNums = 0;
int ans = 0;
for(int i = 0, j = 0; i < A.size(); i++)
{
while(curNums<=K&&j<A.size())
{
if(curNums==K&&!existNums[A[j]]) break;
existNums[A[j]]++;
if(existNums[A[j]]==1) curNums++;
j++;
}
if(curNums<=K) ans+= j-i;
existNums[A[i]]--;
if(existNums[A[i]]==0) curNums--;
}
return ans;
}
int subarraysWithKDistinct(vector<int>& A, int K) {
return subarraysWithLessthanKDistinct(A, K) - subarraysWithLessthanKDistinct(A, K-1);
}
};