Программа курса:
Разбор задачи: Преобладающий элемент
Предложенный нами код решения:
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 candidate1. Что делает функция?
Функция принимает массив чисел nums и возвращает элемент, который встречается в массиве более чем ⌊n/2⌋\lfloor n / 2 \rfloor⌊n/2⌋ раз, где nnn — длина массива.
В задаче гарантируется, что такой элемент всегда существует.
2. Алгоритм Boyer-Moore Majority Vote
Алгоритм основан на двух основных принципах:
- Если существует элемент, встречающийся более n/2n/2n/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:
num = 2,count = 0.- Новый кандидат:
candidate = 2. - Увеличиваем счётчик:
count = 1.
- Итерация 2:
num = 2,candidate = 2.- Совпадение с кандидатом, увеличиваем счётчик:
count = 2.
- Итерация 3:
num = 1,candidate = 2.- Не совпадает с кандидатом, уменьшаем счётчик:
count = 1.
- Итерация 4:
num = 1,candidate = 2.- Не совпадает с кандидатом, уменьшаем счётчик:
count = 0.
- Итерация 5:
num = 1,count = 0.- Новый кандидат:
candidate = 1. - Увеличиваем счётчик:
count = 1.
- Итерация 6:
num = 2,candidate = 1.- Не совпадает с кандидатом, уменьшаем счётчик:
count = 0.
- Итерация 7:
num = 2,count = 0.- Новый кандидат:
candidate = 2. - Увеличиваем счётчик:
count = 1.
Результат:
- После завершения цикла
candidate = 2, что соответствует преобладающему элементу.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии