Сложность: 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.
😎 Решение:
class Solution {
function minKBitFlips($nums, $k) {
$n = count($nums);
$flip = 0;
$flips = 0;
$flipQueue = array_fill(0, $n, 0);
for ($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;
}
}Ставь 👍 и забирай 📚 Базу знаний