Временная сложность внутреннего цикла алгоритма скользящего окна

Я рассматриваю задачу 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). Я был бы очень признателен, если бы кто-нибудь помог мне объяснить эту идею!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

почему общее время выполнения циклов составляет O(n) вместо O(n^2).

Значение l — ключ к пониманию этого. Оно представляет собой общее количество итераций, которые выполнит внутренний цикл в течение полного выполнения алгоритма.

Поскольку l не будет превышать размер входных данных, общее количество выполнений тела внутреннего цикла не будет превышать 𝑛.

Вот почему это не увеличивает общую сложность с O(𝑛) до O(𝑛²). Остаётся O(𝑛).

Действительно, операция сортировки является узким местом с точки зрения сложности.

На самом деле это имело большой смысл. Таким образом, по сути, внутренний цикл повторяет ВСЕГО n раз, а не n раз для каждой итерации r.

enigma312 20.05.2024 22:15

Да, это ключевой момент!

trincot 20.05.2024 22:17

Другие вопросы по теме