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 %를 능가.
세, 기타
아무것도.