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;
}
の結果