2016-01-05 3 views
2

Я пытаюсь решить вопрос следующий вопрос, взятый из leetcode (https://leetcode.com/problems/first-missing-positive/)Нахождение сложность моего кода

Учитывая несортированный массив целых чисел, найти первый недостающий целое положительное число.

Например, Учитывая [1,2,0] Возвращение 3, и [3,4, -1,1] возврата 2.

Ваш алгоритм должен работать в O (N) времени и использования постоянное пространство.

class Solution(object): 
    def firstMissingPositive(self, nums): 
    """ 
    :type nums: List[int] 
    :rtype: int 
    """ 
     for i in range(len(nums)): 
      while nums[i] != i+1: 
       if nums[i]<=0 or nums[i]>len(nums) or nums[i]==nums[nums[i]-1]: 
        break 
       else: 
        temp=nums[nums[i]-1] 
        nums[nums[i]-1]=nums[i] 
        nums[i]=temp 
     for i in range(len(nums)): 
      if nums[i]!=i+1: 
       return i+1 
     return len(nums)+1 
b=Solution() 
print b.firstMissingPositive([1,1]) 

Уверен, что это решение имеет сложность O (n^2). Но все же многие онлайн-решения использовали тот же алгоритм.

Может кто-нибудь объяснить, как этот код O (N) сложность

+1

Это, кажется, O (N^2), вы уверены, что это тот же самый алгоритм? – Untitled123

+2

Трудно сказать, что такое сложность этого кода, потому что цикл while не имеет определенного количества итераций. Возможно, что он имеет O (1) амортизированное время, и в этом случае весь код равен O (N). Я не говорю, что это обязательно так; просто чтобы вы не могли отказаться от возможности в одиночку. – Kevin

+0

Да, вы правы @ Кевин. Но в худшем случае моя сложность - O (n^2) для случая [4,1,2,3] –

ответ

3

Это решение действительно O(n).

Прежде всего обратите внимание, что предложение if в основном цикле происходит не более n раз (самое большее один раз за значение i).

Кроме того, также возникает статья elseO(n), так как если значение уже находится в своем положении, вы никогда не меняете свое местоположение снова (гарантируется из условия if).

Таким образом, в главном цикле, есть в большинстве n записей в пункт if, и в большинстве n записей в пункт else, что дают нам общее время работы O(n) для этого цикла.

Второй цикл (который не вложен в первом), является O(n), так что общая сложность O(n)

+0

в случае ввода [4,1,2,3] мой код, когда он входит в первый цикл, он начнет замену и после того, как первый итерационный массив станет [1,2,3,4] после цикла while запускается 3 раза, и после этого внешний контур будет продолжать движение 3 раза и проверяет, находятся ли все значения в правильном положении. –

+1

@MridulBirla После первой итерации массив сортируется и, следовательно, любые последующие итерации, которые вы собираетесь иметь: 'nums [2] == 3' и, следовательно:' nums [nums [2] -1] == nums [3 -1] == nums [2] == 3' (и аналогично для всех 'i! = 0'), а цикл while while прерывается в O (1). Таким образом, вы в основном используете в своем примере первую итерацию цикла for - это O (n), а следующие n-1 итерации - O (1), что дает вам «O (n + n * 1) = O (n)» total , – amit

Смежные вопросы