假设我们连续有N个灯泡,它们的编号从1到N。首先,所有灯泡都关闭了。我们可以每天只打开一个灯泡,直到N天后所有灯泡都打开。如果我们有一个长度为N的阵列灯泡,其中bulbs [i] = x,则表明在第(i + 1)天,我们将在位置x处打开灯泡。如果我们有另一个整数K,则得出最小天数,以至于存在两个打开的灯泡,而它们之间恰好有K个灯泡全部熄灭。如果没有这样的日子,则返回-1。
因此,如果输入像灯泡:[1,3,2]且K = 1,则输出将为2
在第一天:bulbs [0] = 1,第一个灯泡打开:[1,0,0]
在第二天:bulbs [1] = 3,然后打开第三个灯泡:[1,0,1]
在第三天:bulbs [2] = 2,然后打开第二个灯泡:[1,1,1]
我们将返回2,因为在第二天,灯泡上有两个灯泡,而灯泡之间有一个灯泡。
为了解决这个问题,我们将遵循以下步骤-
n:=灯泡尺寸
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
天[bulbs [i]-1] = i + 1
左:= 0,右:= k + 1,ret:= inf
对于初始化i:= 0,当right <n时,更新(将i增加1),执行-
如果我是正确的,那么-
左:=我
右:= i + k + 1
ret:=最小的ret,最大的天数[left]和days [right]
如果days [i] <days [left]或days [i] <= days [right],则-
返回(如果ret与inf相同,则为-1,否则为ret)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int kEmptySlots(vector<int>& bulbs, int k) {
int n = bulbs.size();
vector<int> days(n);
for (int i = 0; i < n; i++) {
days[bulbs[i] - 1] = i + 1;
}
int left = 0;
int right = k + 1;
int ret = INT_MAX;
for (int i = 0; right < n; i++) {
if (days[i] < days[left] || days[i] <= days[right]) {
if (i == right) {
ret = min(ret, max(days[left], days[right]));
}
left = i;
right = i + k + 1;
}
}
return ret == INT_MAX ? -1 : ret;
}
};
main(){
Solution ob;
vector<int> v = {1,3,2};
cout << (ob.kEmptySlots(v, 1));
}{1,3,2},输出结果
2