Likou-array-falta el primer entero positivo

tema

Dada una matriz de números enteros sin clasificar  nums , encuentre el entero positivo más pequeño que no aparece en ella.

Implemente una solución que tenga una complejidad temporal de 0  O(n) y utilice solo espacio adicional constante.

Ejemplo 1:

**Entrada: **números = [1,2,0]
**Salida: **3

Ejemplo 2:

**Entrada: **números = [3,4,-1,1]
**Salida: **2

Ejemplo 3:

**Entrada: **números = [7,8,9,11,12]
**Salida: **1

pista:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

Ideas

La pregunta requiere la complejidad temporal de On y la complejidad espacial de O1,
por lo que para procesar la matriz en su lugar, podemos almacenar el número correspondiente en la posición donde el número menos 1 se usa como subíndice y finalmente atravesar de adelante hacia atrás. para encontrar el primero Si no coincide, devuelva la respuesta. Tenga en cuenta que durante el proceso de intercambio, debe seguir cambiando hasta que no se pueda intercambiar. La condición para el intercambio es que el número no sea un número negativo. No es necesario cambie números negativos, y el número debe ser menor o igual a Len (nums) porque si es mayor que eso, no tiene sentido y no se recuperará incluso si se intercambia. La posición más lejana de la matriz se toma como El valor y no excederá el subíndice de la matriz. Preste atención al problema de la eliminación de duplicados. Aquí hay dos soluciones. Siempre abra un ha. Si desea eliminar duplicados de la tabla una vez, el problema es que la complejidad del espacio es grande. Otra forma de pensar es que si hay duplicados durante el intercambio, no los reemplace y establezca el que se reemplazará en -1.

código

def firstMissingPositive(self, nums):  
    def Swap(left,right):  
        if(nums[left] == nums[right]):  
            nums[left] = -1  
        temp = nums[left]  
        nums[left] = nums [right]  
        nums[right] = temp  
    for i in range(0,len(nums)):  
        while(nums[i] != i + 1 and nums[i] >= 1 and nums[i] <= len(nums)):  
            Swap(i,nums[i] - 1)  
    for i in range(0,len(nums)):  
        if(i +1 != nums[i]):  
            return i+1  
    return len(nums) + 1
def firstMissingPositive(self, nums):  
    nums = list(set(nums))  
    def Swap(left,right):  
        temp = nums[left]  
        nums[left] = nums [right]  
        nums[right] = temp  
    for i in range(0,len(nums)):  
        while(nums[i] != i + 1 and nums[i] >= 1 and nums[i] <= len(nums)):  
            Swap(i,nums[i] - 1)  
    for i in range(0,len(nums)):  
        if(i +1 != nums[i]):  
            return i+1  
    return len(nums) + 1

Supongo que te gusta

Origin blog.csdn.net/TongOuO/article/details/132522640
Recomendado
Clasificación