Сложность: hard
Дан бинарный массив nums и целое число k.
Операция переворота k-бит заключается в выборе подмассива длиной k из nums и одновременном изменении каждого 0 в подмассиве на 1 и каждого 1 в подмассиве на 0.
Верните минимальное количество k-битных переворотов, необходимых для того, чтобы в массиве не осталось 0. Если это невозможно, верните -1.
Подмассив - это непрерывная часть массива.
Пример:
Input: nums = [0,1,0], k = 1
Output: 2
Explanation: Flip nums[0], then flip nums[2].
👨💻 Алгоритм:
1⃣Инициализация переменных:
Создайте массив flip, чтобы отслеживать, сколько раз был перевернут каждый элемент.
Инициализируйте flips для отслеживания количества текущих переворотов.
2⃣Перебор элементов массива:
Для каждого элемента определите, необходимо ли его переворачивать, учитывая текущее количество переворотов и значение в массиве.
Если нужно перевернуть, увеличьте счетчик переворотов и обновите массив flip.
3⃣Проверка возможности выполнения задачи:
Если количество переворотов больше длины массива, верните -1.
😎 Решение:
public class Solution {
public int minKBitFlips(int[] nums, int k) {
int n = nums.length;
int flip = 0;
int flips = 0;
int[] flipQueue = new int[n];
for (int i = 0; i < n; i++) {
if (i >= k) {
flip ^= flipQueue[i - k];
}
if (nums[i] == flip) {
if (i + k > n) return -1;
flips++;
flip ^= 1;
flipQueue[i] = 1;
}
}
return flips;
}
}Ставь 👍 и забирай 📚 Базу знаний