Алгоритмы обработки данных

Подсчёт и поиск минимума и максимума

Содержание курса

Ручной поиск минимума и максимума: инициализация и сравнение в цикле

Поиск минимума или максимума устроен иначе, чем подсчёт. Здесь не нужен счётчик — нужна переменная, которая хранит «лучшее значение на данный момент». И логика её обновления принципиально другая.

Ключевой момент — инициализация. Переменную current_min (или current_max) нужно выставить в первый элемент списка, а не в ноль или в какое-то произвольное число. Если поставить ноль, а все элементы в списке окажутся отрицательными, алгоритм вернёт неверный результат — он никогда не обновится.

После инициализации перебираем остальные элементы — начиная со второго — и сравниваем каждый с текущим минимумом:

temperatures = [18, 7, 23, -3, 11, 15]

current_min = temperatures[0]  # стартуем с первого элемента
for temp in temperatures[1:]:  # перебираем остальные
    if temp < current_min:
        current_min = temp

print(current_min)  # -3

На каждой итерации Python сравнивает temp с current_min. Если новый элемент меньше — current_min обновляется. Если нет — переменная остаётся прежней. После прохода по всему списку в current_min гарантированно окажется наименьшее значение.

Для максимума структура зеркальная — меняется только знак сравнения:

current_max = temperatures[0]
for temp in temperatures[1:]:
    if temp > current_max:
        current_max = temp

print(current_max)  # 23

Можно найти оба значения за один проход:

temperatures = [18, 7, 23, -3, 11, 15]

current_min = temperatures[0]
current_max = temperatures[0]

for temp in temperatures[1:]:
    if temp < current_min:
        current_min = temp
    if temp > current_max:
        current_max = temp

print(current_min, current_max)  # -3 23

Здесь важно понять два момента, где легко ошибиться.

Первый — срез temperatures[1:]. Технически можно начинать перебор с нулевого элемента, и алгоритм всё равно даст правильный ответ. Но это лишняя итерация: Python сравнит первый элемент сам с собой и ничего не обновит. Срез [1:] — не обязательное требование, а осознанный выбор.

Второй — попытка инициализировать current_min = 0 вместо temperatures[0]. Это классическая ошибка: ноль кажется «нейтральным», но в действительности это конкретное значение. Если все числа в списке положительные, current_min никогда не обновится и вернёт 0 — значение, которого в списке нет.

Отличие от паттерна подсчёта принципиальное: там нас интересует количество элементов, прошедших проверку. Здесь нас интересует само значение — конкретное число из списка, которое «победило» в сравнении. Поэтому вместо count += 1 мы делаем присваивание current_min = temp.