главная новое лучшее написать
2

Ссылка на задачу — 3191. Minimum Operations to Make Binary Array Elements Equal to One I.

📌 Описание задачи

Пример:

💡 Идея

🔍 Детали подхода

  1. Обход массива, используя flip_state для проверки, должен ли текущий элемент быть перевернут.
  2. Если переворот необходим, инкрементируем flip_count и переворачиваем биты flip_state, виртуально изменяя два следующих элемента.
  3. Сдвигаем flip_state вправо на каждой итерации, чтобы учитывать только последние два переворота.
  4. В конце, если flip_state == 0, значит все элементы 1 (возвращаем flip_count), иначе ответ -1 (преобразование невозможно).

📊 Асимптотика

💻 Исходный код

impl Solution {
    pub fn min_operations(nums: Vec<i32>) -> i32 {
        let (flip_count, flip_state) = nums.into_iter()
            .fold((0, 0), |(count, state), num| {
                if num ^ (state & 1) == 0 {
                    (count + 1, (state >> 1) ^ 3) // Flip current and next two elements
                } else {
                    (count, state >> 1) // Shift out the oldest flip
                }
        });

        if flip_state == 0 { flip_count } else { -1 } // If there's an unprocessed flip, it's impossible
    }
}

Tags: #rust #algorithms #bithacks