力扣992.K個不同整數的子陣列-C語言實現
阿新 • • 發佈:2021-02-09
## 題目
[原題連結](https://leetcode-cn.com/problems/subarrays-with-k-different-integers)
給定一個正整數陣列 A,如果 A 的某個子陣列中不同整數的個數恰好為 K,則稱 A 的這個連續、不一定獨立的子陣列為好子陣列。
(例如,[1,2,3,1,2] 中有 3 個不同的整數:1,2,以及 3。)
返回 A 中好子陣列的數目。
示例 1:
>輸入: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].
示例 2:
>輸入:A = [1,2,1,3,4], K = 3
輸出:3
解釋:恰好由 3 個不同整陣列成的子陣列:[1,2,1,3], [2,1,3], [1,3,4].
提示:
1 <= A.length <= 20000
1 <= A[i] <= A.length
1 <= K <= A.length
## 解題
我們要求的是在陣列A中恰好是由k種整陣列成的連續子陣列的個數。
解析:
k種整數,所以至少長度是k
要求連續
這種要求感覺上可以使用雙指標
從頭開始遍歷,左標記為left,右標記為right,
我們通過雙指標經常得到的是最多最大之類的題目,這裡是恰好等於k個,所以轉換一下就是用最大k個不同整數的子陣列個數減去最大k-1不同整數的子陣列的個數就可以得到。
模板:
```c
int subarraysWithKDistinct(int* A, int ASize, int K){
}
```
[題解連結-作者:LeetCode-Solution](https://leetcode-cn.com/problems/subarrays-with-k-different-integers/solution/k-ge-bu-tong-zheng-shu-de-zi-shu-zu-by-l-9ylo/)
```c
int subarraysWithKDistinct(int* A, int ASize, int K) {
int num1[ASize + 1], num2[ASize + 1];
memset(num1, 0, sizeof(int) * (ASize + 1));
memset(num2, 0, sizeof(int) * (ASize + 1));
int tot1 = 0, tot2 = 0;
int left1 = 0, left2 = 0, right = 0;
int ret = 0;
while (right < ASize) {
if (!num1[A[right]]) {
tot1++;
}
num1[A[right]]++;
if (!num2[A[right]]) {
tot2++;
}
num2[A[right]]++;
while (tot1 > K) {
num1[A[left1]]--;
if (!num1[A[left1]]) {
tot1--;
}
left1++;
}
while (tot2 > K - 1) {
num2[A[left2]]--;
if (!num2[A[left2]]) {
tot2--;
}
left2++;
}
ret += left2 - left1;
right++;
}
return ret;
}
```