Задан массив
длины n, найдите его мажорирующий
элемент. Элемент называется мажорирующим, если он встречается в массиве более раз.
Вход. Первая строка содержит число n (1 ≤ n ≤
100). Вторая строка содержит n
натуральных чисел.
Выход. Если массив
содержит мажорирующий элемент, то выведите его. Иначе выведите -1.
Пример
входа 1 |
Пример
выхода 1 |
7 3 3 5 4 2 3 3 |
3 |
|
|
Пример
входа 2 |
Пример
выхода 2 |
4 2 3 2 3 |
-1 |
стек
Анализ алгоритма
Пусть x – мажорирующий элемент. Начнем обрабатывать
входные числа. Каждое число, равное x,
будем класть в стек. При поступлении числа, не равного x, будем извлекать одно число из стека. Тогда в конце обработки
данных вершина стека будет содержать мажорирующий элемент.
Изначально
очистим стек. При обработке очередного элемента a:
·
если стек пустой, то push(a);
·
если на вершине стека находится число a, то push(a);
·
если на вершине стека находится число, не равное a, то pop();
Если по
окончанию обработки всех чисел на вершине стека имеется число x (если стек пустой, то мажоранты нет),
то следует проверить, является ли оно мажорирующим элементом. Для этого следует
посчитать, сколько раз число x
встречается в исходном наборе чисел. Если x
встречается более раз, то ответ
утвердительный.
Поскольку в
стеке в любой момент времени находится одно число (возможно несколько раз), то
промоделируем стек двумя переменными:
·
maj – число в
стеке;
·
cnt – количество
раз, которое число maj находится в
стеке;
Пример
Рассмотрим
первый пример.
По окончанию
алгоритм стеке находится 3. Проверим,
является ли она мажорирующим элементом. Для этого следует посчитать, сколько
раз число 3 встречается в исходном массиве. Число 3 в массиве длины n = 7 встречается 4 раза. Поскольку 4 > , что число 3 является мажорирующим элементом.
Реализация алгоритма
Входную
последовательность чисел сохраним в массиве m.
int m[110];
Объявим
переменные maj и cnt для моделирования стека:
·
maj – число в
стеке;
·
cnt – количество
раз, которое число maj находится в
стеке;
int maj, cnt;
Читаем входные данные.
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d",&m[i]);
Изначально устанавливаем стек пустым.
maj = 0; cnt =
0;
Обрабатываем входные числа, моделируем работу стека.
for(int
i = 0; i < n; i++)
{
Если стек пустой (cnt
= 0), то кладем в него элемент m[i].
if (cnt == 0)
{maj = m[i]; cnt++;}
Если текущий элемент m[i]
совпадает с вершиной стека maj, то
кладем m[i] в стек.
else if (m[i] == maj) cnt++;
Иначе извлекаем элемент из стека.
else cnt--;
}
В переменной cnt
подсчитаем, сколько раз число maj
встречается в массиве m.
cnt = 0;
for(int
i = 0; i < n; i++)
if (m[i] ==
maj) cnt++;
Если cnt > , то мажоранта существует. Иначе нет (res присвоим -1).
if(2 * cnt > n) res = maj; else res = -1;
Выводим ответ.
printf("%d\n",res);
Java реализация
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m[] = new int[n];
for(int i = 0; i < n; i++)
m[i] = sc.nextInt();
int maj = 0, cnt = 0;
for(int i = 0; i < n; i++)
{
if (cnt == 0) {maj = m[i]; cnt++;}
else if (m[i] == maj) cnt++;
else cnt--;
}
cnt = 0;
int res;
for(int i = 0; i < n; i++)
if (m[i] == maj) cnt++;
if(2 * cnt > n) res = maj; else res = -1; // cnt
> nums.size() / 2
System.out.println(res);
}
}
Python реализация
Читаем входные данные.
n = int(input())
m = list(map(int, input().split()))
Объявим
переменные maj и cnt для моделирования стека:
·
maj – число в
стеке;
·
cnt – количество
раз, которое число maj находится в
стеке;
Изначально устанавливаем стек пустым.
maj = 0
cnt = 0
Обрабатываем входные числа, моделируем работу стека.
for num in m:
Если стек пустой (cnt
= 0), то кладем в него элемент num.
if cnt == 0:
maj = num
cnt += 1
Если текущий элемент num совпадает с
вершиной стека maj, то кладем num в стек.
elif num == maj:
cnt += 1
Иначе извлекаем элемент из стека.
else:
cnt -= 1
В переменной cnt
подсчитаем, сколько раз число maj
встречается в списке m.
cnt = 0
for num in m:
if num == maj: cnt += 1
Если cnt > , то мажоранта существует. Иначе нет (res присвоим -1).
if 2 * cnt > n: res = maj
else: res = -1
Выводим ответ.
print(res)