Я бы предположил, что алгоритм Бойера-Мура (связанный с nunes и описанный cldy в других ответах) является предполагаемым ответом на вопрос;но определение «элемента большинства» в вопросе слишком слабое, чтобы гарантировать, что алгоритм будет работать.
Если n - размер списка.Мажоритарный элемент - это элемент, который встречается как минимум в ceil (n / 2) раз.
Алгоритм Бойера-Мура находит элемент с строгим большинством, если такой элемент существует.(Если вы заранее не знаете, что у вас есть такой элемент, вы должны сделать второй проход по списку, чтобы проверить результат.)
Для строгого большинства вам нужно "...строго больше, чем пол (n / 2) раз ", а не" ... по крайней мере, ceil (n / 2) раз ".
В вашем примере" 1 "встречается 3 раза, а другие значения встречаются 3времена:
Пример ввода: 1, 2, 1, 1, 3, 2
Выход: 1
, но вам нужно 4 элемента сто же самое значение для строгого большинства.
Это действительно работает в данном конкретном случае:
Input: 1, 2, 1, 1, 3, 2
Read 1: count == 0, so set candidate to 1, and set count to 1
Read 2: count != 0, element != candidate (1), so decrement count to 0
Read 1: count == 0, so set candidate to 1, and set count to 1
Read 1: count != 0, element == candidate (1), so increment count to 2
Read 3: count != 0, element != candidate (1), so decrement count to 1
Read 2: count != 0, element != candidate (1), so decrement count to 0
Result is current candidate: 1
, но посмотрите, что произойдет, если в конце "1" и "2" в концепоменялись местами:
Input: 1, 2, 1, 2, 3, 1
Read 1: count == 0, so set candidate to 1, and set count to 1
Read 2: count != 0, element != candidate (1), so decrement count to 0
Read 1: count == 0, so set candidate to 1, and set count to 1
Read 2: count != 0, element != candidate (1), so decrement count to 0
Read 3: count == 0, so set candidate to 3, and set count to 1
Read 1: count != 0, element != candidate (3), so decrement count to 0
Result is current candidate: 3