Я смотрю в Интернете и знаю, что list.pop()
имеет временную сложность O (1), но list.pop(i)
имеет временную сложность O (n). Пока я пишу leetcode, многие люди используют pop(i)
в цикле for, и они говорят, что это сложность по времени O(n), и на самом деле это быстрее, чем мой код, который использует только один цикл, но много строк в этом цикле. Интересно, почему это произошло, и должен ли я использовать pop(i)
вместо многих строк, чтобы избежать этого?
Пример: Leetcode 26. Удалить дубликаты из отсортированного массива
Мой код: (быстрее 75%)
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left, right = 0, 0
count = 1
while right < len(nums)-1:
if nums[right] == nums[right+1]:
right += 1
else:
nums[left+1]=nums[right+1]
left += 1
right += 1
count += 1
return count
и чужой код быстрее, чем на 90%: (этот парень не говорит O(n), но почему O(n^2) быстрее, чем мой O(n)?)
Мой оптимизированный код (быстрее 89%)
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left, right = 0, 0
while right < len(nums)-1:
if nums[right] != nums[right+1]:
nums[left+1]=nums[right+1]
left += 1
right += 1
return left + 1
n^2
всегда доминирует над терминомn
. Важно то, что алгоритмы сравниваются путем измерения фактического времени выполнения, а не их сложности. Однако вы делаете правильный вывод; Я отредактировал, чтобы добавить предложение об этом. 16.01.2020