[Требования к вопросу] Дайте вам n чисел и n. Теперь вам нужно найти количество, которое происходит более 50% времени в пространстве O (n) в пределах O (1).
[Start Bullshit] В начале я увидел этот вопрос мгновенно ослеплен (tot)/~~~ (.*). Если существует только требование времени o (n), его можно мгновенно решить с помощью хэша (то есть с пространством для времени), и кажется трудно решить пространство O (1).
[Мысль 1] Двойной цикл, это наименее эффективный способ решить эту проблему, то есть рассчитайте количество раз, когда она появляется для каждого числа, и сложность времени o (n^2) непосредственно выходит.
[Подумал 2] Сначала сортируйте, пусть аналогичные числа будут расположены вместе, а затем пройдут с первого числа. Теперь приведите пример, например: 1000012, теперь сортируйте: 0000112, запустите с 0, установите счетчик t = 0, теперь есть 4 0s, затем t = 4, обнаружите, что более половины из них, вывод 0. Этот метод является оптимизированной версией предыдущего метода.
[Мысль 3] Это идея обмена пространством на время и хешинг, чтобы сделать одномерный массив, имеет два значения. Например, [x] = y представляет, что число x появляется в времени. Сложность времени этого метода - O (n), но пространство на самом деле ... Я не буду говорить об этом (*  ̄ ̄)
[Мысль 4] Сначала рассчитайте вероятность, выберите количество этих чисел, которые наиболее вероятно соответствуют требованиям, а затем случайным образом выберите несколько. Это ... забудь об этом.
[Мысль 5] Сегодняшняя тема-так называемый алгоритм MJRTY, также известный как алгоритм голосования большинства. Основные идеи заключаются в следующем: (Временная сложность этого алгоритма - O (n)! Нет необходимости в дополнительном хранении в космосе, поэтому сложность пространства - O (1) !!!)
Если count == 0, установите значение голосования на текущий элемент массива и назначить счету до 1;
В противном случае, если голосовать и теперь элементы массива имеют одинаковое значение, count ++, в противном случае Count;
Повторите два вышеуказанных шага, пока массив не сканируется.
Подсчет назначен на 0 и снова сканируйте массив с самого начала. Если значение элемента массива такое же, как и значение голосования, Count ++ до сканирования массива.
Если значение подсчета больше или равно N/2 в настоящее время, значение голосования будет возвращено, в противном случае будет возвращено -1;
Ниже приводится реализация кода. Поскольку вопрос гарантирует, что результат должен существовать, мы пропустили последний этап проверки и проверки.
Ключевой код заключается в следующем:
#include <iostream> Использование пространства имен Std; int len; void find (int* a, int n) {char candidate; int ntimes, i; for (i = ntimes = 0; i <n; i ++) {if (ntimes == 0) кандидат = a [i], ntimes = 1; else {if (кандидат == a [i]) ntimes ++; else ntimes-;}}} cout << кандидат; } int main () {cin >> len; int a [len]; for (int i = 0; i <n; i ++) cin >> a [i]; find (a, len); system ("pause"); return 0;}Вышеуказанное число более половины (50%) от количества случаев, введенных вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!