LeetCode-992.K個の異なる整数を持つサブアレイ[K個の異なる整数を持つサブアレイ]-分析とコード[Java]
1.トピック
正の整数Aの配列が与えられ、Aのサブ配列内の異なる整数の数がたまたまKである場合、Aのこの連続的で、必ずしも独立していないサブ配列は、適切なサブ配列と呼ばれます。
(たとえば、[1,2,3,1,2]には1、2、および3の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
出典:LeetCode(LeetCode)
リンク:https://leetcode-cn.com/problems/subarrays-with-k-different-integers
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2、分析とコード
1.スライディングウィンドウ
(1)考える
問題によると、適切なサブ配列の特性を見つけることができます。右の境界が決定されると、異なるK個の整数を満たす左の境界の端点が連続した間隔になります。
したがって、同じ右境界を持つ2つのスライディングウィンドウは、間隔にKとK-1の異なる整数が存在するように設計できます。右の境界線が毎回移動する場合、2つのウィンドウの左の境界線の位置の違いは、現在の右の境界線の下にある適切なサブ配列の数です。
(2)コード
class Solution {
public int subarraysWithKDistinct(int[] A, int K) {
int n = A.length, ans = 0;
//为滑动窗口设计2个左指针,指向不同整数个数为K和K-1的子数组左边界
int[] num1 = new int[n + 1];
int[] num2 = new int[n + 1];
for (int i = 0; i <= n; i++) {
num1[i] = 0;
num2[i] = 0;
}
int l1 = 0, l2 = 0, r = 0;
int diff1 = 0, diff2 = 0;
while (r < n) {
if (num1[A[r]]++ == 0)
diff1++;
if (num2[A[r++]]++ == 0)
diff2++;
while (diff1 > K)
if (--num1[A[l1++]] == 0)
diff1--;
while (diff2 > K - 1)
if (--num2[A[l2++]] == 0)
diff2--;
ans += l2 - l1;
}
return ans;
}
}
(3)結果
実行時間:4ミリ秒、
すべてのJava送信でユーザーの97.66%を上回っています。メモリ消費量:41.8 MB、すべてのJava送信でユーザーの71.05%を上回っています。
3、その他
何もありません。