思路就是从左到右,如果遇到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个数的翻转取决于前面第i-K个数的翻转过程。利用滑动窗口优化,难度比较大
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;
}
};