1. 程式人生 > >力扣992.K個不同整數的子陣列-C語言實現

力扣992.K個不同整數的子陣列-C語言實現

## 題目 [原題連結](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; } ```