Registro de escovação Leetcode (2): 278 A primeira versão errada éBadVersion(version)

Site de perguntas de pincel: Leetcode

Dificuldade: fácil

Idioma: Python

Plano : De fácil -> a médio -> a difícil.

1. A primeira versão errada de 278

1.1 Descrição do problema

Suponha que no desenvolvimento de versão, todas as versões após a versão errada estejam erradas. Existe numa versão [1,2,...,n], se você quiser encontrar a primeira versão inválida que causou a falha de todas as versões subsequentes.

bool isBadVersion(version)Você pode julgar se o número da versão versionestá errado em testes de unidade chamando a interface. A implementação de uma função para encontrar a primeira versão inválida deve minimizar o número de chamadas para a API.

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

1.2 Pensamento e Análise

No início, é fácil entender mal o significado do título ou não entender o título. Observe os dois pontos a seguir:

  • 1) Por exemplo, o número da versão [1,2,3,...n]é expresso na forma de certo e errado [********######], o que *significa #número de versão correto e errado, e o título requer a posição da primeira ocorrência #.
  • 2) isBadVersion(3) -> falseO significado desta frase não é simplesmente falseentender que está errado, mas isBadVersion()julgar se está errado. Se falsea dupla negativa for igual a afirmação, então esta frase significa que a versão está correta, caso contrário isBadVersion(4) -> ture, significa que a quarta o número da versão está errado.

Depois de entender o significado da pergunta, podemos escrever o código correspondente. Esta questão também é um método de classificação binária, semelhante à busca binária do array 704 anterior .

1.3 Processo de resolução de problemas

Antes de tudo, o console fornece o código inicial, só precisamos escrevê-lo depois.

# 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 questão já disse que a isBadVersion APIinterface está definida, assumimos que ela já existe, e não há necessidade de defini-la nós mesmos. Portanto, essa questão não pode ser depurada no pycharm, mas só pode ser depurada localmente no leetcode.

  • (1) Em primeiro lugar, ao contrário do método anterior, o índice subscrito não é usado aqui, mas o número da versão de 1 a n diretamente, então precisamos definir o valor inicial da extremidade esquerda para 1
left=1
  • (2) Então, precisamos de um loop para determinar se é a localização do primeiro erro. Observe que as condições para o estabelecimento do loop não podem ser escritas left<=n, mas devem ser escritas left<n. Caso contrário, ele cairá em um loop infinito e excederá o limite de tempo, ou seja, para garantir que haja pelo menos dois números de versão.
while left<n:
  • (3) Finalmente, você precisa adicionar uma instrução de julgamento para chamar se a interface é true. Inicialmente, eu não sabia como chamá-lo isBadVersion() API, então imitei diretamente o título e o escrevi
if isBadVersion() -> true:

\qquadMas após a execução, ele sempre solicita o seguinte erro

SyntaxError: invalid syntax

\qquadQuando ->mudei para comum, recebi o ==seguinte erro

NameError:name'ture' is not defined

\qquadDepois, depois de pensar isBadVersion()nisso, já está definido, então não deve haver problema, ou seja, há um problema depois. Pense na ifinstrução depois que a condição for estabelecida e, em seguida, execute. Portanto, eu simplesmente removi a parte de trás e consegui.

if isBadVersion():
  • (4) O código final é o seguinte
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

Os resultados da execução são os seguintes:
insira a descrição da imagem aqui
95,9% dos usuários são derrotados, então o algoritmo não deve ser ruim, outros podem ter configurações diferentes para cada computador, resultando em tempos diferentes.

1.4 Resumo

O objetivo dessa pergunta é entender o significado da pergunta, não entendi no começo, mas só depois de ler os comentários é que entendi APIo significado de chamar a interface. A ideia do algoritmo ainda é o método de busca binária, que é um pouco diferente do anterior, é melhor prestar mais atenção e praticar mais.

Acho que você gosta

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