LeetCode-992。K個の異なる整数を持つサブ配列-分析とコード(Java)

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、その他

何もありません。

おすすめ

転載: blog.csdn.net/zml66666/article/details/113839272