Здравствуйте, я работал над https://leetcode.com/problems/2-keys-keyboard/submissions/ и натолкнулся на этот вопрос о динамическом программировании.
Вы начинаете с 'A' на пустой странице, и вы получаете число n
, когда выГотово, вы должны иметь n
раз «А» на странице.Подвох в том, что вам разрешено копировать только 2 операции (и вы можете копировать только общее количество A, находящихся в данный момент на странице) и вставлять -> найти минимальное количество операций, чтобы получить n
'A' на странице.
Я написал следующий алгоритм, который решает проблему, но мне сложно анализировать его временную сложность.
Вот код:
def minSteps(self, n: int) -> int:
DP = [0] + [0] + [i for i in range(2, n+1)]
for d in range(2, n+1):
for i in range(d*2, n+1, d):
DP[i] = min(DP[i], DP[d] + i//d )
return DP[n]
Итак, моя интуиция говоритэтот алгоритм находится между O(n^2)
и O(nlogn)
, так как во втором цикле мы идем "быстрее", чем O(n)
, однако, поскольку размер шага d
не удваивается между каждой итерацией, он все равно O(n)
в некоторой степени длявторой цикл ...
Я не уверен, как его проанализировать, любая помощь приветствуется.