KC++の空のスロット
N個の電球が連続していて、1からNまでの番号が付けられているとします。最初は、すべての電球がオフになっています。 N日後にすべての電球がオンになるまで、毎日1つの電球をオンにすることができます。長さNのアレイ電球があり、bulbs [i] =xの場合、これは(i + 1)日目に位置xで電球をオンにすることを示します。別の整数Kがある場合、最小日数が2つ存在するように、それらの間に正確にK個の球根があり、すべてがオフになっています。そのような日がない場合は、-1を返します。
したがって、入力が球根のようなものである場合:[1,3,2]およびK =1の場合、出力は2 as
になります。-
初日:bulbs [0] =1、最初の電球がオンになります:[1,0,0]
-
2日目:bulbs [1] =3、次に3番目の電球がオンになります:[1,0,1]
-
3日目:bulbs [2] =2、次に2番目の電球がオンになります:[1,1,1]
2日目には、2つの電球があり、1つの電球が間にあるため、2を返します。
これを解決するには、次の手順に従います-
-
n:=電球のサイズ
-
初期化i:=0の場合、i
-
日数[球根[i]-1]=i + 1
-
-
左:=0、右:=k + 1、ret:=inf
-
初期化i:=0の場合、右
-
days [i]
-
iが右と同じ場合、-
-
ret:=retの最小値と日数の最大値[左]と日数[右]
-
-
左:=i
-
右:=i + k + 1
-
-
-
return(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
-
C ++のisnormal()
このセクションでは、C ++のisnormal()関数について説明します。この関数はcmathライブラリにあります。この関数は、数値が正常かどうかを確認するために使用されます。非正規と見なされる数値は、ゼロ、無限大、またはNANです。 この関数は、引数としてfloat、double、またはlongdoubleの値を取ります。数値が正常な場合は1を返し、それ以外の場合は0を返します。 例 #include<iostream> #include<cmath> using namespace std; int main() { cout <&
-
C ++の空のクラスのオブジェクトのサイズはどれくらいですか?
以下は、空のクラスのオブジェクトのサイズを見つける例です。 例 #include <bits/stdc++.h> using namespace std; class p1 { public: void first() { cout << "\nThe parent class p1 function is called."; } }; class p2 { }; int main() { cout <