Table of Contents
Problem Statement
The Subarrays with K Different Integers LeetCode Solution – “Subarrays with K Different Integers” states that you’re given an integer array nums and an integer k. We need to find a total number of good subarrays of nums.
A good array is defined as an array with exactly k distinct integers, whereas a subarray is defined as a contiguous part of an array.
Example:
Input: nums = [1,2,1,2,3], k = 2
Output: 7
Explanation:
- There is a total of 15 subarrays.
- Subarrays with exactly k distinct integers are: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
Input: nums = [1,2,1,3,4], k = 3
Output: 3
Explanation:
- Subarrays with exactly 3 distinct integers are: [1,2,1,3], [2,1,3], [1,3,4].
Approach
Idea:
- The main idea to solve this problem is to use Hashmap and the sliding window technique.
- Let S(k) be the total number of subarrays with at most k distinct elements.
- Then, we need to find S(k) – S(k-1).
- To calculate S(k), we will use the sliding window technique to find the required number of elements.
- We’ll keep two pointers i and j, and each time we’ll increment the forward pointer i by 1 unit.
- Also, for each forward pointer i, we’ll try to find the least index j such that j<=i and the number of distinct elements in the range [j, i] is not greater than k.
- For each position of i, we’ll add the required valid subarrays i – j + 1 to our answer.
- We’ll return our answer as S(k) – S(k-1).
Code
Subarrays with K Different Integers Leetcode C++ Solution:
class Solution {
public:
int AtmostK(vector<int>& nums,int k){
unordered_map<int,int> freq;
int n = nums.size(),ans = 0,j = 0;
for(int i=0;i<n;i++){
freq[nums[i]]++;
if(freq[nums[i]]==1){
k--;
}
while(k<0){
freq[nums[j]]--;
if(!freq[nums[j]]){
k++;
}
j++;
}
ans += i - j + 1;
}
return ans;
}
int subarraysWithKDistinct(vector<int>& nums, int k) {
int ans = AtmostK(nums,k) - AtmostK(nums,k-1);
return ans;
}
};Subarrays with K Different Integers Leetcode Java Solution:
class Solution {
public int subarraysWithKDistinct(int[] A, int K) {
return atMostK(A, K) - atMostK(A, K - 1);
}
int atMostK(int[] A, int K) {
int i = 0, res = 0;
Map<Integer, Integer> count = new HashMap<>();
for (int j = 0; j < A.length; ++j) {
if (count.getOrDefault(A[j], 0) == 0) K--;
count.put(A[j], count.getOrDefault(A[j], 0) + 1);
while (K < 0) {
count.put(A[i], count.get(A[i]) - 1);
if (count.get(A[i]) == 0) K++;
i++;
}
res += j - i + 1;
}
return res;
}
}Complexity Analysis for Subarrays with K Different Integers Leetcode Solution
Time Complexity
The time complexity of the above code is O(N) since we traverse the entire array in a linear time and a good hash function allows insertion and deletion in O(1) time, where N = size of the input array. We can also use a hashmap that allows insertion and deletion in logarithmic time.
Space Complexity
The space complexity of the above code is O(N) since the maximum size of the hashmap can be O(N).