1、暴力超时,从左到右一个一个看
class Solution {
public:
int minKBitFlips(vector<int>& A, int K) {
int n = A.size();
int ans = 0;
for(int i = 0; i < n; i++)//直接暴力从左到右遍历
{
if(A[i] != 1 && i < n)
{
ans++;
for(int j = i; j < i+K; j++)
{
if(j >= n)return -1;
A[j] = !A[j];
}
//i = i+K;
}else{
continue;
}
}
return ans;
}
};
2、滑动窗口的计算方法是:我一开始统计一个总的反转次数resum,每当我窗口往前滑动的时候我就要把我前面的翻转次数减掉
class Solution {
public:
int minKBitFlips(vector<int>& A, int K) {
int count = 0;
int resum = 0;
for(int i = 0; i < A.size(); i++)
{
if(i - K >= 0 && A[i - K] < 0)
{
resum--;
}
if(((resum&1)^A[i]) == 0)//判断当前位置是不是0,翻转奇数次还是偶数次,偶数0 A[i]=0就需要翻转
{
if(i + K > A.size())return -1;
A[i] = ~A[i];
resum++;
count++;
}
}
return count;
}
};