Описание проблемы:
Учитывая непустой список слов, вернуть k наиболее часто встречающихся элементов.
Ваш ответ должен быть отсортирован по частоте от самой высокой к самой низкой.Если два слова имеют одинаковую частоту, то слово с более низким алфавитным порядком идет первым.
Например: Пример 1: Ввод: ["i", "love", "stackoverflow", "i", "love "," coding "], k = 2 Вывод: [" i "," love "] Объяснение:" i "и" love "- два наиболее часто встречающихся слова.Обратите внимание, что «i» стоит перед «любовью» из-за более низкого алфавитного порядка.
Мое решение Python с использованием частотных интервалов:
def topKFrequent(words, k):
wordCount = collections.Counter(words)
freq = [[] for i in range(len(words) + 1)]
res = []
for word, count in wordCount.items():
freq[count].append(word)
for i in range(len(freq) - 1, 0, -1):
if k == 0:
break
elif k >= len(freq[i]):
res.extend(sorted(freq[i]))
k -= len(freq[i])
else:
res.extend(sorted(freq[i])[:k])
break
return res
Теперь я утверждаю, чтовыполняется в O (nlogn), игнорируя инициализацию Counter и инициализацию freq, каждый из которых O (n), в последнем цикле в худшем случае будет один блок со всеми словами в нем (каждое слово появляется ровно один раз), поэтому мы в итоге просто сортируем этот сегмент, который является nlog (n).
Является ли приведенный выше корректный интуитивный анализ?