Редакция для Размах массива
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
Разбор задачи «Размах массива»
1. Идея
Нужно найти разброс значений массива, то есть разность между максимальным и минимальным элементами.
Иными словами, требуется вычислить:
max(a) - min(a)
Самый простой способ — пройти по всем элементам массива один раз, одновременно поддерживая:
mn— минимальное значение среди уже просмотренных,mx— максимальное значение среди уже просмотренных.
После этого ответом будет mx - mn.
2. Наблюдения
- Чтобы найти разброс, не нужно сортировать массив.
- Достаточно знать только два числа:
- самый маленький элемент,
- самый большой элемент.
- Если массив состоит из одного элемента, то минимум и максимум совпадают, поэтому ответ равен
0. - Ограничение
n <= 2 * 10^5подсказывает, что решение заO(n)подходит отлично.
3. Алгоритм
- Считываем
n. - Считываем все значения.
- Берём первый элемент и считаем, что пока:
mn = первый элемент,mx = первый элемент.
- Для каждого следующего элемента:
- если он меньше
mn, обновляемmn, - если он больше
mx, обновляемmx.
- если он меньше
- Выводим
mx - mn.
4. Почему это работает
При просмотре массива слева направо мы всегда храним:
- минимальный элемент среди всех уже встреченных,
- максимальный элемент среди всех уже встреченных.
После обработки всех элементов:
mnбудет минимумом всего массива,mxбудет максимумом всего массива.
По определению разброса массива ответ равен разности между максимумом и минимумом, то есть mx - mn.
Значит, алгоритм находит правильный ответ.
5. Сложность
- Время:
O(n), так как каждый элемент рассматривается ровно один раз. - Память:
- в приведённом решении на C++ —
O(1), так как элементы можно обрабатывать по одному; - в приведённом решении на Python —
O(n), так как числа сначала сохраняются в список.
- в приведённом решении на C++ —
6. Код на C++17
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
long long x;
cin >> x;
long long mn = x, mx = x;
for (int i = 1; i < n; i++) {
cin >> x;
if (x < mn) mn = x;
if (x > mx) mx = x;
}
cout << (mx - mn) << "\n";
return 0;
}
7. Код на Python 3
n = int(input())
a = list(map(int, input().split()))
mn = a[0]
mx = a[0]
for x in a[1:]:
if x < mn:
mn = x
if x > mx:
mx = x
print(mx - mn)
Комментарии