Registro de cepillado de Leetcode (2): 278 La primera versión incorrecta es BadVersion (versión)

Sitio web de preguntas de pincel: Leetcode

Dificultad: fácil

Idioma: pitón

Plan : De fácil -> a medio -> a difícil.

1. La primera versión incorrecta de 278

1.1 Descripción del problema

Suponga que en el desarrollo de versiones, todas las versiones posteriores a la versión incorrecta son incorrectas. Hay nuna versión [1,2,...,n], si desea encontrar la primera versión incorrecta que provocó que fallaran todas las versiones posteriores.

bool isBadVersion(version)Puede juzgar si el número de versión versiones incorrecto en las pruebas unitarias llamando a la interfaz. La implementación de una función para encontrar la primera versión incorrecta debería minimizar la cantidad de llamadas a la API.

  • Ejemplo 1
输入:n=5,bad=4
输出:4
解释:
调用 isBadVersion(3) -> false 
调用 isBadVersion(5) -> true 
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
  • Ejemplo 2
输入:n = 1, bad = 1
输出:1

1.2 Pensamiento y análisis

Al principio, es fácil malinterpretar el significado del título o no entender el título. Tenga en cuenta los dos puntos siguientes:

  • 1) Por ejemplo, el número de versión [1,2,3,...n]se expresa en forma de correcto e incorrecto [********######], lo que *significa un #número de versión correcto e incorrecto, y el título requiere la posición de la primera aparición #.
  • 2) isBadVersion(3) -> falseEl significado de esta oración no es simplemente falseentender que está mal, sino isBadVersion()juzgar si está mal. Si falsela doble negación es igual a la afirmación, entonces esta oración significa que la versión es correcta, de lo contrario isBadVersion(4) -> turesignifica que la cuarta el número de versión es incorrecto.

Después de comprender el significado de la pregunta, podemos escribir el código correspondiente. Esta pregunta también es un método de clasificación binaria, similar a la búsqueda binaria de la matriz 704 anterior .

1.3 Proceso de resolución de problemas

En primer lugar, la consola da el código inicial, solo necesitamos escribirlo más tarde.

# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):

class Solution:
    def firstBadVersion(self, n):
        """
        :type n: int
        :rtype: int
        """

Esta pregunta ya ha dicho que la isBadVersion APIinterfaz está definida, asumimos que ya existe y no hay necesidad de definirla nosotros mismos. Por lo tanto, esta pregunta no se puede depurar en pycharm, pero solo se puede depurar localmente en leetcode.

  • (1) En primer lugar, a diferencia del método anterior, aquí no se usa el índice de subíndice, sino el número de versión de 1 a n directamente, por lo que debemos definir el valor inicial del extremo izquierdo en 1
left=1
  • (2) Luego, necesitamos un ciclo para determinar si es la ubicación del primer error. Tenga en cuenta que las condiciones para el establecimiento del bucle no se pueden escribir left<=n, pero deben escribirse left<n. De lo contrario, caerá en un bucle infinito y excederá el límite de tiempo, es decir, para garantizar que haya al menos dos números de versión.
while left<n:
  • (3) Finalmente, debe agregar una declaración de juicio para llamar si la interfaz es true. Al principio, no sabía cómo llamarlo isBadVersion() API, así que directamente imité el título y lo escribí.
if isBadVersion() -> true:

\qquadPero después de la ejecución, siempre muestra el siguiente error

SyntaxError: invalid syntax

\qquadCuando lo ->cambié a común, recibí el ==siguiente error

NameError:name'ture' is not defined

\qquadDespués, después de pensarlo isBadVersion(), ya está definido, por lo que no debería haber ningún problema, es decir, hay un problema después. Piense en la ifdeclaración después de que se establezca la condición y luego ejecútela. Por lo tanto, simplemente quité la parte posterior y lo logré.

if isBadVersion():
  • (4) El código final es el siguiente
class Solution:
    def firstBadVersion(self, n):
        """
        :type n: int
        :rtype: int
        """
        left = 1
        while left<n:
            mid = (n-left)//2 + left
            if isBadVersion(mid):
                n = mid
            else:
                left = mid + 1
        return left

Los resultados de la ejecución son los siguientes: el
inserte la descripción de la imagen aquí
95,9% de los usuarios son derrotados, por lo que el algoritmo no debe ser malo.Otros pueden tener configuraciones diferentes para cada computadora, lo que resulta en un tiempo diferente.

1.4 Resumen

El objetivo de esta pregunta es entender el significado de la pregunta. No lo entendí al principio, pero solo después de leer los comentarios supe APIel significado de llamar a la interfaz. La idea del algoritmo sigue siendo el método de búsqueda binaria, que es ligeramente diferente al anterior, es mejor prestar más atención y practicar más.

Supongo que te gusta

Origin blog.csdn.net/A33280000f/article/details/121136160
Recomendado
Clasificación