LeetCode-992. K 개의 다른 정수 분석 및 코드를 사용하는 하위 배열 (자바)

LeetCode-992. K 개의 다른 정수를 가진 하위 배열 [K 개의 다른 정수를 가진 하위 배열]-분석 및 코드 [자바]

1. 주제

양의 정수 A의 배열이 주어 졌을 때 A의 하위 배열에있는 서로 다른 정수의 수가 K 인 경우 A의이 연속적이고 반드시 독립적 인 하위 배열을 좋은 하위 배열이라고합니다.
(예를 들어, [1,2,3,1,2]에는 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. 길이 <= 20000
  • 1 <= A [i] <= A. 길이
  • 1 <= K <= A. 길이

출처 : LeetCode (LeetCode)
링크 : https://leetcode-cn.com/problems/subarrays-with-k-different-integers
저작권은 LeetCode 가 소유 합니다 . 상업적 재판의 경우 공식 승인에 문의하고 비상업적 재판의 경우 출처를 표시하십시오.

둘째, 분석 및 코드

1. 슬라이딩 윈도우

(1) 생각

문제에 따르면 좋은 하위 배열의 특성을 찾을 수 있습니다. 오른쪽 경계가 결정되면 서로 다른 K 정수를 만족하는 왼쪽 경계 끝 점이 연속 간격에 있습니다.
따라서 오른쪽 경계가 동일한 두 개의 슬라이딩 윈도우는 간격에 K 및 K-1 다른 정수가 있도록 설계 할 수 있습니다. 오른쪽 테두리가 매번 이동할 때 두 창의 왼쪽 테두리 위치 간의 차이는 현재 오른쪽 테두리 아래에있는 양호한 하위 배열의 수입니다.

(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) 결과

실행 시간 : 4ms,
모든 Java 제출에서 사용자의 97.66 %를 능가, 메모리 소비 : 41.8MB, 모든 Java 제출에서 사용자의 71.05 %를 능가.

세, 기타

아무것도.

추천

출처blog.csdn.net/zml66666/article/details/113839272