LeetCode Daily Question 992.K個の異なる整数のサブ配列

992.K個の異なる整数のサブ配列

正の整数の配列を与え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

方法1:スライディングウィンドウ

問題解決のアイデア

古いルールは、2つのポインターで「スライディングウィンドウ」をシミュレートすることです。

この質問は別の考え方です。「最大K個の異なる整数を含むサブ配列の数」と「最大K-1個の異なる整数を含むサブ配列の割合」を見つけ、2つを引くと「サブ配列」になります。 K個の異なる整数の「数」。

参照コード

public int subarraysWithKDistinct(int[] A, int K) {
    
    
    return atMostK(A, K) - atMostK(A, K - 1);
}


public int atMostK(int[] A, int K) {
    
    
    int n = A.length;
    int[] counts = new int[n + 1];

    int count = 0;
    int ret = 0;
    int left = 0, right = 0;
    while (right < n) {
    
    
        if (counts[A[right]] == 0) {
    
    
            count++;
        }
        counts[A[right]]++;
        right++;

        while (count > K) {
    
    
            counts[A[left]]--;
            if (counts[A[left]] == 0) {
    
    
                count--;
            }
            left++;
        }
        ret += right - left;
    }
    return ret;
}

の結果
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_27007509/article/details/113768185