1+ public class Solution683 {
2+ private int ans ;
3+ private int left ;
4+ private int right ;
5+
6+ public int kEmptySlots (int [] bulbs , int k ) {
7+ int n = bulbs .length ;
8+ int [] days = new int [n ];
9+ for (int i = 0 ; i < n ; i ++) {
10+ days [bulbs [i ] - 1 ] = i + 1 ;
11+ }
12+
13+ ans = Integer .MAX_VALUE ;
14+ left = 0 ;
15+ right = k + 1 ;
16+ extracted (k , n , days );
17+ return ans == Integer .MAX_VALUE ? -1 : ans ;
18+ }
19+
20+ private void extracted (int k , int n , int [] days ) {
21+ while (right < n ) {
22+ for (int i = left + 1 ; i < right ; i ++) {
23+ if (days [i ] < days [left ] || days [i ] < days [right ]) {
24+ left = i ;
25+ right = i + k + 1 ;
26+ extracted (k , n , days );
27+ return ;
28+ }
29+ }
30+ ans = Math .min (ans , Math .max (days [left ], days [right ]));
31+ left = right ;
32+ right = left + k + 1 ;
33+ }
34+ }
35+
36+ public int kEmptySlots2 (int [] bulbs , int k ) {
37+ int [] days = new int [bulbs .length ];
38+ for (int i = 0 ; i < bulbs .length ; i ++) {
39+ days [bulbs [i ] - 1 ] = i + 1 ;
40+ }
41+
42+ int ans = Integer .MAX_VALUE ;
43+ int left = 0 , right = k + 1 ;
44+
45+ // search:
46+ while (right < days .length ) {
47+ boolean flag = false ;
48+ for (int i = left + 1 ; i < right ; ++i ) {
49+ if (days [i ] < days [left ] || days [i ] < days [right ]) {
50+ left = i ;
51+ right = i + k + 1 ;
52+ flag = true ;
53+ break ;
54+ // continue search;
55+ }
56+ }
57+ if (flag ) {
58+ continue ;
59+ }
60+
61+ ans = Math .min (ans , Math .max (days [left ], days [right ]));
62+ left = right ;
63+ right = left + k + 1 ;
64+ }
65+
66+ return ans < Integer .MAX_VALUE ? ans : -1 ;
67+ }
68+ }
69+ /*
70+ $683. K 个关闭的灯泡
71+ https://leetcode.cn/problems/k-empty-slots/
72+
73+ n 个灯泡排成一行,编号从 1 到 n 。最初,所有灯泡都关闭。每天 只打开一个 灯泡,直到 n 天后所有灯泡都打开。
74+ 给你一个长度为 n 的灯泡数组 blubs ,其中 bulls[i] = x 意味着在第 (i+1) 天,我们会把在位置 x 的灯泡打开,其中 i 从 0 开始,x 从 1 开始。
75+ 给你一个整数 k ,请返回恰好有两个打开的灯泡,且它们中间 正好 有 k 个 全部关闭的 灯泡的 最小的天数 。如果不存在这种情况,返回 -1 。
76+ 提示:
77+ n == bulbs.length
78+ 1 <= n <= 2 * 10^4
79+ 1 <= bulbs[i] <= n
80+ bulbs 是一个由从 1 到 n 的数字构成的排列
81+ 0 <= k <= 2 * 10^4
82+
83+ 滑动窗口
84+ java continue label 参考 https://leetcode.cn/problems/k-empty-slots/solution/k-ge-kong-hua-pen-by-leetcode/
85+ */
0 commit comments