Редакция для Количество различных значений
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно узнать, сколько разных чисел встречается в массиве.
Самая прямая идея: хранить все уже встреченные значения в структуре данных, которая не допускает повторов. Тогда:
- если число встретилось впервые, оно добавится;
- если такое число уже было, ничего не изменится.
После обработки всех элементов размер этой структуры и будет ответом.
Для этого удобно использовать множество (set в Python, unordered_set в C++).
2. Наблюдения
Нас интересуют только различные значения, а не количество повторений.
Например, для массива
7 7 7 7 7ответ равен1, потому что различных значений только одно.Порядок элементов не важен.
Не имеет значения, в каком месте встретился код цветка. Важно только, был ли он уже раньше.
Множество автоматически убирает повторы.
Если несколько раз вставить одно и то же значение, в множестве оно всё равно хранится один раз.
Ограничение
n <= 2 * 10^5подсказывает, что решение должно работать быстро.Перебирать все пары элементов было бы слишком медленно, а использование множества позволяет решить задачу эффективно.
3. Алгоритм
- Считать число
n. - Создать пустое множество.
- Прочитать
nчисел. - Каждое число добавить в множество.
- Вывести размер множества.
4. Почему это работает
Рассмотрим, что происходит при обработке массива.
- Для каждого элемента
a_iмы пытаемся добавить его в множество. - Если такого значения там ещё нет, оно появится.
- Если оно уже есть, множество не изменится.
Значит, после обработки всех n чисел в множестве будут находиться ровно все различные значения из массива, каждое по одному разу.
Следовательно, количество различных значений равно размеру множества.
5. Сложность
При использовании множества:
- время: в среднем
O(n), так как каждая вставка работает в среднем заO(1); - память:
O(n)в худшем случае, если все элементы различны.
Это укладывается в ограничения.
6. Код на C++17
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int n;
cin >> n;
unordered_set<long long> s;
for (int i = 0; i < n; i++) {
long long x;
cin >> x;
s.insert(x);
}
cout << s.size() << '\n';
return 0;
}
7. Код на Python 3
n = int(input())
a = list(map(int, input().split()))
print(len(set(a)))
Комментарии