C ++中的K个空插槽

假设我们连续有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