アイデアは、左から右に移動し、0に遭遇すると反転し、すべてのビットが1になるまで、この時間計算量はO(NK)、タイムアウトです。
class Solution {
public:
int minKBitFlips(vector<int>& A, int K) {
// 贪心的思想,遇到0就向后翻转,将这一位变为1
int n = A.size(), res = 0;
for(int i=0;i<n;i++){
if(A[i]==0){
if(i+K>n) return -1;
for(int j=i;j<i+K;j++){
A[j]^=1;
}
res++;
}
}
return res;
}
};
最適化プロセス:i番目の数の回転は、iK番目の数の前の回転プロセスに依存することがわかっています。より困難なスライディングウィンドウ最適化を使用する
class Solution {
public:
int minKBitFlips(vector<int>& A, int K) {
queue<int> q;
int res = 0;
for(int i=0;i<A.size();i++){
if(!q.empty()&&i-q.front()>=K){
q.pop();
}
if(q.size()%2==0&&A[i]==0){
if(i+K>A.size()) return -1;
A[i] = 1;
res++;
q.push(i);
}else if(q.size()%2==1&&A[i]==1){
if(i+K>A.size()) return -1;
A[i] = 0;
res++;
q.push(i);
}
}
return res;
}
};