K Empty Slots is a very famous problem on LeetCode. The problem statement is like that- A garden is consists of n slots containing a flower each. All the flowers are unbloomed initially. Given an array a[ ] of flowers and an integer k. Considering i stating from 0, i+1’th flower will bloom on day a[i] . For example – let a [ ] = {1, 3, 2} means the first flower will bloom on day 1, the second flower will bloom on day 3 and the third flower will bloom on day 2. Print the day on which there will be k unbloomed flowers between two bloomed flowers else print -1 if no answer exists. For example – ln a [ ] = {1, 3, 2} and k=1, the output is 2 as on the second day first and the third flower will be bloomed with k i.e. 1 unbloomed flower between them.
Table of Contents
Example
Input
a[ ] = {1, 4, 3, 2, 5}
k = 2
Output
2
Input
a[ ] = {1, 2, 3, 4}
k = 1
Output
-1
Algorithm
Now we know the problem statement of K Empty Slots LeetCode. So, without taking much time we move to algorithm used to solve this problem.
- Initialize an array a and an integer k.
- Initialize another array days to store days o which each flower will bloom.
- Traverse the days array with i starting from zero and update the array as days[a[i]] = i+1.
- Set result as INT_MAX.
- Traverse the array again. Store the left and right values with k slots between in 2 variables and find it’s maximum.
- At each step traverse from 1 to k and check if days[i+j] is less than the maximum value break the inner loop and set flag false.
- If the flag is true, set result as maximum value.
- If the result is equal to INT_MAX return -1 else return res.
Implementation
C++ Program for K Empty Slots LeetCode
#include <bits/stdc++.h>
using namespace std;
int kSlots(int a[], int k, int n) {
int days[n+1];
for(int i=0; i<n; i++){
days[a[i]] = i+1;
}
int res = INT_MAX;
n = sizeof(days)/sizeof(days[0]);
for(int i=1; i<n; i++){
int l = days[i];
int r = days[i+k+1];
int m1 = max(l, r);
int m2 = min(l, r);
bool flag = true;
for(int j=1; j<=k; j++){
if(days[i + j]<m1){
flag = false;
break;
}
}
if(flag && m1<res){
res = m1;
}
}
return res == INT_MAX ? -1 : res;
}
int main(){
int a[] = {1, 3, 2};
int k = 1;
int n = sizeof(a)/sizeof(a[0]);
cout<<kSlots(a, k, n);
return 0;
}
2
Java Program for K Empty Slots LeetCode
class kEmptySlots{
static int kSlots(int[] a, int k) {
int[] days = new int[a.length + 1];
for(int i=0; i<a.length; i++) {
days[a[i]] = i+1;
}
int res = Integer.MAX_VALUE;
for(int i=1; i< days.length-k-1; i++){
int l = days[i];
int r = days[i+k+1];
int max = Math.max(l, r);
int min = Math.min(l, r);
boolean flag = true;
for(int j=1; j<=k; j++){
if(days[i + j]<max){
flag = false;
break;
}
}
if(flag && max<res){
res = max;
}
}
return res == Integer.MAX_VALUE ? -1 : res;
}
public static void main (String[] args){
int a[] = {1, 3, 2};
int k = 1;
System.out.println(kSlots(a, k));
}
}2
Complexity Analysis
Time Complexity: O(N*K) where N is the size of the given array, and K is the given value which denotes the number of unbloomed flowers between two bloomed flowers.
Space Complexity: O(N) where N is the size of the given array. Here we an array days[n] for storing the bloomed flower information.