题目解析:
题目要求同时翻转K个长度的子数组,首先贪心策略很好想到就是在操作上有些问题,如果每次都进行发转那么会超时的,我们需要想一个办法使得时间复杂度从O(N×K)降到O(N)
题解中思路是使用了差分数组来记录反转次数,并且巧妙利用了差分数组的性质,即:
对 [i-i+K] 的数组进行反转,只会影响diff(差分数组)的i与i+K+1为的值,其余的值都不会受到影响,因而我们自然就不必对其进行任何操作了,这样我们就可以在O(N)的时间复杂度内得到个位的反转次数。
代码
class Solution {
public:
int minKBitFlips(vector<int> &A, int K) {
int n = A.size();
int count_n = 0;
int i = 0;
vector<int> diff(n+1,0);
int sum_n = 0;
for(i = 0;i<n;i++)
{
sum_n+=diff[i+1];
if((sum_n+A[i])%2==0) //需要发生发转了 只影响i+1与 i+1+K
{
if(i+K>n)
{
return -1;
}
count_n++;
sum_n++;
if(i+K<n)
diff[i+K+1]--;
}
}
return count_n;
}
};