Я пытаюсь решить эту алгоритмическую проблему:
https://dunjudge.me/analysis/problems/469/
Для удобства я кратко привел описание проблемы.
Учитывая массив длины (< = 20000000), содержащий целые числа в диапазоне [0, 1,000,000], найдите длинный subarray, содержащий элемент большинства.
Элемент most определяется как элемент, который имеет место > floor (n/2) раз в списке длины n.
Ограничение по времени: 1,5 с
Например:
Если данный массив равен [1, 2, 1, 2, 3, 2],
Ответ 5, потому что подмассив [2, 1, 2, 3, 2] длиной 5 из позиции 1-5 (с индексом 0) имеет номер 2, который появляется 3 > этаж (5/2) раз. Обратите внимание, что мы не можем взять весь массив, потому что 3 = пол (6/2).
<ч/" > Моя попытка:
Первое, что приходит на ум, - это очевидное решение грубой силы (но правильное), которое фиксирует начальные и конечные индексы подмассива и циклически проходит через него, чтобы проверить, содержит ли он элемент большинства. Затем мы берем длину самого длинного подмассива, содержащего элемент большинства. Это работает в O (n ^ 2) с небольшой оптимизацией. Ясно, что это не пройдет срок.
Я также думал о разделении элементов на ведра, содержащие их индексы в отсортированном порядке.
Используя приведенный выше пример, эти ковши будут:
1: 0, 2
2: 1, 3, 5
3: 4
Затем для каждого ведра я попытался объединить индексы вместе, чтобы найти самый длинный подмассив, содержащий k как элемент большинства, где k - целая метка этого ведра. Тогда мы могли бы взять максимальную длину по всем значениям k. Я не пробовал это решение, так как не знал, как выполнить слияние.
Может кто-нибудь, пожалуйста, посоветуйте мне о лучшем подходе к решению этой проблемы?
Edit:
Я решил эту проблему благодаря ответам PhamTrung и hk6279. Хотя я принял ответ от PhamTrung, потому что он сначала предложил эту идею, я рекомендую смотреть на ответ hk6279, потому что его ответ развивает идею PhamTrung и намного более подробно (а также идет с приятным формальное доказательство!).