Матч 41, Мажорующий элемент (MajorityElement)

 

Массив содержит мажорующий элемент x если он встречается в массиве строго больше половины раз. По заданному массиву вернуть мажорующий элемент или -1, если такого не существует.

 

Класс: MajorityElement

Метод: int findMajorityElement(vector<int> a)

Ограничения: a содержит от 1 до 50 элементов, 0 £ a[i] £ 1000.

 

Вход. Массив чисел а.

 

Выход. Мажорующий элемент массива или -1, если такого не существует.

 

Пример входа

a

{3, 9, 3, 3, 7}

{0, 1000, 984, 0}

{5}

 

Пример выхода

3

-1

5

 

 

РЕШЕНИЕ

обработка последовательностей

 

Для решения задачи будем использовать стек, который изначально пуст. Будем последовательно просматривать числа массива и совершать следующие операции:

1. Если стек пуст или вершина стека содержит текущий просматриваемый элемент массива, то заносим текущий элемент в стек.

2. Иначе удаляем элемент из вершины стека.

Если массив содержит мажорующий элемент, то он и только он может остаться в стеке после обработки всех чисел массива. Если стек после обработки массива пуст, то возвращаем -1. Иначе проходим по массиву еще раз, и подсчитываем сколько раз в нем встречается элемент, находящийся на вершине стека. Если он встречается более половины раз, то возвращаем его. Иначе возвращаем -1.

Можно заметить, что в стеке может находиться только одно число. Поэтому работу стека можно промоделировать при помощи двух переменных:

numчисло находящееся в стеке;

cnt – количество чисел num, находящихся в стеке.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <stack>

using namespace std;

 

stack<int> s;

 

class MajorityElement

{

public:

  int findMajorityElement(vector<int> a)

  {

    int i,c;

    for(i=0;i<a.size();i++)

      if (s.empty() || s.top() == a[i]) s.push(a[i]);

      else s.pop();

    if (s.empty()) return -1;

    for(c=i=0;i<a.size();i++)

      if (a[i] == s.top()) c++;

    if (2*c > a.size()) return s.top();

    return -1;

  }

};

 

Промоделируем работу стека двумя переменными.

 

#include <cstdio>

#include <vector>

using namespace std;

 

class MajorityElement

{

public:

  int findMajorityElement(vector<int> a)

  {

    int num, cnt, i, c;

    // num = number in stack

    // cnt = how many num's are in stack

    for(num = cnt = i = 0; i < a.size(); i++)

      if ((!cnt) || (num == a[i])) cnt++, num = a[i];

      else cnt--;

    if (!cnt) return -1;

    for(c=i=0;i<a.size();i++)

      if (a[i] == num) c++;

    if (2*c > a.size()) return num;

    return -1;

  }

};