Программа курса:
Разбор задачи: Может производить арифметическую прогрессию из последовательности
Предложенный нами код решения:
def canMakeArithmeticProgression(arr):
"""
Проверяет, можно ли переставить элементы массива так, чтобы они образовали арифметическую прогрессию.
:param arr: список целых чисел
:return: True, если можно образовать арифметическую прогрессию, иначе False
"""
if len(arr) <= 2: # Список из 0, 1 или 2 элементов всегда можно считать прогрессией
return True
arr.sort() # Сортируем массив
diff = arr[1] - arr[0] # Вычисляем разность между первыми двумя элементами
for i in range(1, len(arr) - 1):
if arr[i + 1] - arr[i] != diff:
return False
return True
Фрагменты кода с пояснением
- Обработка крайних случаев:
if len(arr) <= 2: # Список из 0, 1 или 2 элементов всегда можно считать прогрессией
return True- Если массив состоит из 0, 1 или 2 элементов, он всегда является арифметической прогрессией, поскольку:
- В пустом массиве нет элементов, и он тривиально удовлетворяет условию.
- В массиве с одним элементом нет соседей для проверки разностей.
- В массиве из двух элементов разность между ними определена однозначно.
Пример:
Для массива [], [7] или [2, 5] функция сразу возвращает True.
- Сортировка массива:
arr.sort() # Сортируем массив- Для удобства проверки разностей соседних элементов массив сортируется. Это позволяет проверить разности, двигаясь последовательно от начала к концу.
- Без сортировки элементы могут быть в произвольном порядке, что затруднит проверку.
Пример:
Входной массив: [3, 5, 1].
После сортировки: [1, 3, 5].
- Вычисление эталонной разности:
diff = arr[1] - arr[0] # Вычисляем разность между первыми двумя элементами
- Вычисляем разность между первым и вторым элементами массива. Эта разность становится эталонной, с которой сравниваются все последующие разности.
Пример:
Для массива [1, 3, 5] эталонная разность: 3 - 1 = 2.
- Проверка соседних разностей:
for i in range(1, len(arr) - 1):
if arr[i + 1] - arr[i] != diff:
return False- Идем по массиву, начиная с третьего элемента, и проверяем разность между текущим элементом и предыдущим.
- Если хотя бы одна разность не совпадает с эталонной, возвращаем
False. - Если все разности совпадают, после завершения цикла возвращаем
True.
Пример:
Для массива [1, 3, 5]:
- Проверяем:
3 - 1 = 2(совпадает с эталоном). - Проверяем:
5 - 3 = 2(совпадает с эталоном).
Ответ:True.
Для массива [1, 2, 4]:
- Проверяем:
2 - 1 = 1(совпадает с эталоном). - Проверяем:
4 - 2 = 2(не совпадает с эталоном).
Ответ:False.
- Возврат результата:
return True- Если массив прошел проверку без нарушений, возвращаем
True. Это означает, что все разности одинаковы, и массив может быть преобразован в арифметическую прогрессию.
Полный разбор с примером
Пример 1:
Входной массив: [3, 5, 1].
- Шаг 1: Проверяем длину массива. Длина больше 2, идем дальше.
- Шаг 2: Сортируем массив:
[1, 3, 5]. - Шаг 3: Вычисляем эталонную разность:
3 - 1 = 2. - Шаг 4: Проверяем разности:
3 - 1 = 2(совпадает).5 - 3 = 2(совпадает).
- Вывод: Все разности совпадают, возвращаем
True.
Пример 2:
Входной массив: [1, 2, 4].
- Шаг 1: Проверяем длину массива. Длина больше 2, идем дальше.
- Шаг 2: Сортируем массив:
[1, 2, 4]. - Шаг 3: Вычисляем эталонную разность:
2 - 1 = 1. - Шаг 4: Проверяем разности:
2 - 1 = 1(совпадает).4 - 2 = 2(не совпадает).
- Вывод: Найдена разность, которая не совпадает с эталоном. Возвращаем
False.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии