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 n
uma 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 version
está 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) -> false
O significado desta frase não é simplesmentefalse
entender que está errado, masisBadVersion()
julgar se está errado. Sefalse
a dupla negativa for igual a afirmação, então esta frase significa que a versão está correta, caso contrárioisBadVersion(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 API
interface 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 escritasleft<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á-loisBadVersion() 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 if
instruçã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:
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 API
o 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.