Просто потому, что решение не O (n), вы не можете считать его O (n ^ 2).
Это не совсем O (n ^ 2), потому что он использует pop в обратном порядке, который уменьшает время на pop каждый раз, использование pop (i) на forward forward будет занимать больше времени, чем на обратный, поскольку поп ищет в обратном направлении, и в каждом l oop он уменьшает количество элементов на спине. Попробуйте то же самое решение в обратном порядке, запустите несколько раз, чтобы убедиться, что вы увидите.
В любом случае, относительно того, почему его решение быстрее, у вас есть условие if с большим количеством переменных, он имеет используется только одна переменная prev_obj
, использование в обратном порядке позволяет делать только одну переменную. Таким образом, число базовых c математических операций в вашем случае больше, поэтому при одинаковой сложности O (n) каждый из ваших n-циклов длиннее, чем его.
Просто посмотрите на вашу переменную count, в каждой итерации ее значение равно left+1
, вы можете вернуть left+1
, просто удалив, что уменьшит n на count=count+1
, что вам нужно сделать.
Я только что опубликовал это решение, и оно на 76% быстрее
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
a=sorted(set(nums),key=lambda item:item)
for i,v in enumerate(a):
nums[i]=v
return len(a)
, и это дает быстрее, чем 90% .
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
a ={k:1 for k in nums} #<--- this is O(n)
for i,v in enumerate(a.keys()): #<--- this is another O(n), but the length is small so O(m)
nums[i]=v
return len(a)
Вы можете сказать как их больше, чем O (n), если вы посмотрите на l oop, но, поскольку мы работаем с дублирующими членами, когда я зацикливаюсь на сокращенных членах, в то время как ваш код циклично распространяется на всех членах. Таким образом, время, необходимое для создания этого уникального набора / дикта, будет меньше, чем требуется для вас l oop над этими дополнительными членами и для проверки наличия условий, тогда мое решение может быть быстрее.