Я рассматриваю задачу LeetCode 1838. Частота наиболее частого элемента:
Частота элемента — это количество раз, когда он встречается в массиве.
Вам дан целочисленный массив
nums
и целое числоk
. За одну операцию вы можете выбрать индексnums
и увеличить элемент с этим индексом на1
.Возвращает максимально возможную частоту элемента после выполнения не более
k
операций.
У меня есть этот подход скользящего окна, который решает эту проблему:
def maxFrequency(self, nums: List[int], k: int) -> int:
nums.sort()
res, curSum = 0, 0
l = 0
for r in range(len(nums)):
total = nums[r] * (r - l + 1) # the goal
curSum += nums[r] # what we currently have
# check if we have enough operations to reach our goal
while total - curSum > k:
# remove L until we have valid subsequence
curSum -= nums[l]
l += 1
total = nums[r] * (r - l + 1)
res = max(res, r - l + 1)
return res
На форумах утверждается, что этот подход имеет время выполнения O(nlogn)
, поскольку он ограничен сортировкой массива nums
, но я не понимаю расчета.
Я предположил, что время выполнения цикла for
равно O(n) и что время выполнения внутреннего цикла while
в наихудшем случае также равно O(n). В результате временная сложность программы не будет равна:
O(nlogn) + [O(n) * O(n)] = O(nlogn) + O(n^2) = O(n^2)?
Мой вопрос: почему общее время выполнения циклов равно O(n)
вместо O(n^2)
. Я был бы очень признателен, если бы кто-нибудь помог мне объяснить эту идею!
почему общее время выполнения циклов составляет O(n) вместо O(n^2).
Значение l
— ключ к пониманию этого. Оно представляет собой общее количество итераций, которые выполнит внутренний цикл в течение полного выполнения алгоритма.
Поскольку l
не будет превышать размер входных данных, общее количество выполнений тела внутреннего цикла не будет превышать 𝑛.
Вот почему это не увеличивает общую сложность с O(𝑛) до O(𝑛²). Остаётся O(𝑛).
Действительно, операция сортировки является узким местом с точки зрения сложности.
Да, это ключевой момент!
На самом деле это имело большой смысл. Таким образом, по сути, внутренний цикл повторяет ВСЕГО n раз, а не n раз для каждой итерации
r
.