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

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

技術標籤:# C語言力扣刷題資料結構leetcode演算法c語言

題目

原題連結
給定一個正整數陣列 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不同整數的子陣列的個數就可以得到。

模板:

int subarraysWithKDistinct(int* A, int ASize, int K){
  
}

題解連結-作者:LeetCode-Solution

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; }