Разбор задачи: Преобладающий элемент

Предложенный нами код решения:

def majority_element(nums):
    """
    Находит преобладающий элемент в массиве.

    :param nums: Список чисел.
    :return: Преобладающий элемент.
    """
    count = 0
    candidate = None

    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)

    return candidate

1. Что делает функция?

Функция принимает массив чисел nums и возвращает элемент, который встречается в массиве более чем ⌊n/2⌋\lfloor n / 2 \rfloor⌊n/2⌋ раз, где nnn — длина массива.

В задаче гарантируется, что такой элемент всегда существует.


2. Алгоритм Boyer-Moore Majority Vote

Алгоритм основан на двух основных принципах:

  1. Если существует элемент, встречающийся более n/2n/2n/2 раз, то "вес" всех остальных элементов никогда не сможет превысить "вес" этого элемента.
  2. Переменная count позволяет отслеживать баланс "веса" текущего кандидата на преобладающий элемент.

3. Пошаговое объяснение работы функции

Начальная инициализация:

count = 0
candidate = None
  • candidate хранит текущего кандидата на преобладающий элемент.
  • count отслеживает, сколько раз этот кандидат был подтверждён.

Итерация по массиву:

for num in nums:
  • Для каждого элемента массива проверяется, нужно ли сменить кандидата или подтвердить текущего.

Выбор или изменение кандидата:

if count == 0:
    candidate = num
  • Если count равен нулю, значит, текущий кандидат потерял "вес", и мы выбираем новый кандидат.

Обновление счётчика:

count += (1 if num == candidate else -1)
  • Если текущий элемент равен кандидату, увеличиваем "вес" кандидата (count).
  • Если не равен, уменьшаем "вес".

Возврат результата:

return candidate
  • После завершения цикла в переменной candidate гарантированно окажется преобладающий элемент.

4. Пример работы функции

Входные данные: nums = [2, 2, 1, 1, 1, 2, 2]

  1. Итерация 1:
    • num = 2, count = 0.
    • Новый кандидат: candidate = 2.
    • Увеличиваем счётчик: count = 1.
  2. Итерация 2:
    • num = 2, candidate = 2.
    • Совпадение с кандидатом, увеличиваем счётчик: count = 2.
  3. Итерация 3:
    • num = 1, candidate = 2.
    • Не совпадает с кандидатом, уменьшаем счётчик: count = 1.
  4. Итерация 4:
    • num = 1, candidate = 2.
    • Не совпадает с кандидатом, уменьшаем счётчик: count = 0.
  5. Итерация 5:
    • num = 1, count = 0.
    • Новый кандидат: candidate = 1.
    • Увеличиваем счётчик: count = 1.
  6. Итерация 6:
    • num = 2, candidate = 1.
    • Не совпадает с кандидатом, уменьшаем счётчик: count = 0.
  7. Итерация 7:
    • num = 2, count = 0.
    • Новый кандидат: candidate = 2.
    • Увеличиваем счётчик: count = 1.

Результат:

  • После завершения цикла candidate = 2, что соответствует преобладающему элементу.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии