leetcode 991. Calculadora rota (python)

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento

describir

Hay una calculadora rota que inicialmente tiene el entero startValue en su pantalla. En una sola operación, puede:

  • multiplique el número en pantalla por 2, o
  • restar 1 del número en pantalla.

Dados dos enteros startValue y target, devuelva el número mínimo de operaciones necesarias para mostrar el objetivo en la calculadora.

Ejemplo 1:

Input: startValue = 2, target = 3
Output: 2
Explanation: Use double operation and then decrement operation {2 -> 4 -> 3}.
复制代码

Nota:

1 <= x, y <= 10^9

Analizar gramaticalmente

De acuerdo con la pregunta, hay una calculadora rota que inicialmente muestra el entero startValue en su pantalla. Solo podemos hacer una de las siguientes cosas a la vez:

  • multiplicar el número mostrado por 2, o
  • Resta 1 del número mostrado.

Dados dos enteros startValue y target, devuelve el número mínimo de operaciones requeridas para mostrar el objetivo en la calculadora.

Una mirada a este tipo de pregunta debe ser para examinar el algoritmo codicioso. Solo podemos realizar las operaciones de multiplicar por 2 y restar 1 para garantizar el número mínimo de operaciones desde startValue hasta el objetivo. Sabemos que multiplicar por 2 definitivamente puede reducir el número de operaciones significativamente, por lo que tratamos de usar la multiplicación por 2 tanto como sea posible, la idea general es esta, pero creo que la operación inversa es más fácil de entender (preferencia personal), por lo que cambiamos de target a startValue, para que podamos solo divide por 2 y suma 1 hecho.

Solo necesitamos ajustar continuamente el tamaño del objetivo en un bucle, tratando de que sea igual a startValue. Durante cada ciclo, juzgamos que si el objetivo es un número impar, debemos agregar uno al objetivo (para asegurarnos de que se convierta en un número par para la división por 2) y agregar uno al resultado para contar. En este momento, si el objetivo es mayor que startValue, divida directamente el objetivo por 2 y agregue uno al resultado para contar; de lo contrario, significa que el objetivo es menor que startValue, use directamente el resultado más la diferencia (startValue - target) para contar, y luego contar el objetivo Se puede cambiar a startValue. Después de que termine el ciclo, regrese directamente al resultado.

La complejidad temporal es O(logtarget) y la complejidad espacial es O(1).

responder

class Solution(object):
    def brokenCalc(self, startValue, target):
        result = 0
        while target != startValue:
            if target % 2:
                target += 1
                result += 1
            if target > startValue:
                target //= 2
                result += 1
            else:
                result += (startValue - target)
                target = startValue
        return result	
复制代码

resultado de la operación

Runtime: 19 ms, faster than 87.50% of Python online submissions for Broken Calculator.
Memory Usage: 13.4 MB, less than 75.00% of Python online submissions for Broken Calculator.
复制代码

Enlace del título original

leetcode.com/problemas/br…

Tu apoyo es mi mayor motivación.

Supongo que te gusta

Origin juejin.im/post/7078459144117682206
Recomendado
Clasificación