在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。
返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。
class Solution {
public:
//差分数组.
int minKBitFlips(vector<int>& nums, int k) {
int n = nums.size();
vector<int> dp(n + 1, 0);
int ans = 0, cnt = 0;
for(int i = 0; i < n; i++){
ans ^= dp[i];
if(ans ^ nums[i] == 0){
if(i + k > n) return -1;
cnt++; ans ^= 1; dp[i + k] ^= 1;
}
}
return cnt;
}
};