From b9762b19fc6a38e6e8ffa9a76a4f1f255e133df6 Mon Sep 17 00:00:00 2001 From: Ashwagandha-coder Date: Thu, 8 May 2025 16:07:22 +0100 Subject: [PATCH] add 992 --- .../slidingWindow/SlidingWindowLeetcode.kt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt index 238ed13b..cc970657 100644 --- a/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt +++ b/contest/src/main/java/com/github/contest/slidingWindow/SlidingWindowLeetcode.kt @@ -205,3 +205,35 @@ fun minSubArrayLen(target: Int, nums: IntArray): Int { else -> minLen } } + +/** + * 992. Subarrays with K Different Integers + */ + +fun subArraysWithKDistinct(nums: IntArray, k: Int): Int { + return atMostK(nums, k) - atMostK(nums, k - 1) +} + +private fun atMostK(nums: IntArray, k: Int): Int { + var count = 0 + val freq = mutableMapOf() + var left = 0 + + for (right in nums.indices) { + val num = nums[right] + freq[num] = freq.getOrDefault(num, 0) + 1 + + while (freq.size > k) { + val leftNum = nums[left] + freq[leftNum] = freq[leftNum]!! - 1 + if (freq[leftNum] == 0) { + freq.remove(leftNum) + } + left++ + } + + count += right - left + 1 + } + + return count +}