forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 1
/
_683.java
61 lines (55 loc) · 1.99 KB
/
_683.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.fishercoder.solutions;
/**
* 683. K Empty Slots
*
* There is a garden with N slots. In each slot, there is a flower.
*
* The N flowers will bloom one by one in N days.
*
* In each day, there will be exactly one flower blooming and it will be in the status of blooming since then.
*
* Given an array flowers consists of number from 1 to N. Each number in the array represents the place where the flower will open in that day.
* For example, flowers[i] = x means that the unique flower that blooms at day i will be at position x,
* where i and x will be in the range from 1 to N.
*
* Also given an integer k, you need to output in which day there exists two flowers in the status of blooming,
* and also the number of flowers between them is k and these flowers are not blooming.
* If there isn't such day, output -1.
Example 1:
Input:
flowers: [1,3,2]
k: 1
Output: 2
Explanation: In the second day, the first and the third flower have become blooming.
Example 2:
Input:
flowers: [1,2,3]
k: 1
Output: -1
Note:
The given array will be in the range [1, 20000].
*/
public class _683 {
public static class Solution1 {
/**credit: https://discuss.leetcode.com/topic/104771/java-c-simple-o-n-solution*/
public int kEmptySlots(int[] flowers, int k) {
int[] days = new int[flowers.length];
for (int i = 0; i < flowers.length; i++) {
days[flowers[i] - 1] = i + 1;
}
int left = 0;
int right = k + 1;
int result = Integer.MAX_VALUE;
for (int i = 0; right < flowers.length; i++) {
if (days[i] < days[left] || days[i] <= days[right]) {
if (i == right) {
result = Math.min(result, Math.max(days[left], days[right]));
}
left = i;
right = k + 1 + i;
}
}
return result == Integer.MAX_VALUE ? -1 : result;
}
}
}