Algoritmo leetcode | 69. La raíz cuadrada de x (el óxido golpea fuerte)



69. Raíz cuadrada de x:

Dado un entero no negativo x, calcule y devuelva xla raíz cuadrada aritmética de .

Dado que el tipo de retorno es un número entero, solo se conserva la parte entera del resultado y se descartará la parte decimal .

NOTA : Las funciones y operadores exponenciales integrados como pow(x, 0.5)o no están permitidos x ** 0.5.

Ejemplo 1:

输入:
	
	x = 4
	
输出:
	
	2

Ejemplo 2:

输入:
	
	x = 8
	
输出:
	
	2
	
解释:
	
	8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

pista:

  • 0 <= x <= 2 31 - 1

analizar:

  • Frente a este problema de algoritmo, el segundo líder volvió a pensar profundamente.
  • Se requiere la raíz cuadrada, pero la función exponencial incorporada no está permitida, lo cual es deliberadamente difícil para mí.
  • Cracking de fuerza bruta, de todos modos, siempre que los números enteros, de 1 a x, intente uno por uno, puede encontrar la solución más cercana, es muy simple, pero es demasiado simple, debe haber una mejor manera.
  • La respuesta solo necesita ser un número entero. Encuentre el valor óptimo del valor continuo lineal. Creo que puedo usar el método de dicotomía y seguir intentándolo. La eficiencia de la dicotomía es muy alta y la cantidad de datos se puede reducir a la mitad. cada vez, lo que ya es satisfactorio.
  • Hay una mejor manera. La respuesta debe ser un número entero aproximado, por lo que también puede usar el método iterativo de Newton , que es muy adecuado para encontrar una solución aproximada de manera eficiente. Se dice que la eficiencia es mayor que la puntuación binaria.
  • Siento que las matemáticas todavía son muy poderosas. Muchas cosas se pueden resolver de manera eficiente con métodos matemáticos. Aunque las computadoras ya son muy rápidas, muchas veces se pueden resolver mucho más rápido con métodos matemáticos. Tengo muchas ganas de aprender matemáticas bien.
  • Todas las soluciones a los siguientes problemas utilizan el método iterativo de Newton para encontrar soluciones aproximadas, por lo que debe haber un grado, un punto para dejar de continuar. Generalmente se cree que cuando la diferencia entre las dos soluciones obtenidas consecutivamente es muy pequeña, entonces es hora de parar.

respuesta:

óxido:

impl Solution {
    
    
    pub fn my_sqrt(x: i32) -> i32 {
    
    
        if x == 0 {
    
    
            return 0;
        }

        let (c, mut x0) = (x as f64, x as f64);
        loop {
    
    
            let xi = 0.5 * (x0 + c / x0);
            if (x0 - xi).abs() < 1e-7 {
    
    
                break;
            }
            x0 = xi;
        }

        return x0 as i32;
    }
}

ir:

func mySqrt(x int) int {
    
    
    if x == 0 {
    
    
		return 0
	}

	c, x0 := float64(x), float64(x)
	for {
    
    
		xi := 0.5 * (x0 + c/x0)
		if math.Abs(x0-xi) < 1e-7 {
    
    
			break
		}
		x0 = xi
	}

	return int(x0)
}

c++:

class Solution {
    
    
public:
    int mySqrt(int x) {
    
    
        if (x == 0) {
    
    
            return 0;
        }

        double c = x, x0 = x;
        while (true) {
    
    
            double xi = 0.5 * (x0 + c / x0);
            if (fabs(x0 - xi) < 1e-7) {
    
    
                break;
            }
            x0 = xi;
        }

        return int(x0);
    }
};

pitón:

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0

        c, x0 = float(x), float(x)
        while True:
            xi = 0.5 * (x0 + c / x0)
            if abs(x0 - xi) < 1e-7:
                break
            x0 = xi

        return int(x0)


Java:

class Solution {
    
    
    public int mySqrt(int x) {
    
    
        if (x == 0) {
    
    
            return 0;
        }

        double c = x, x0 = x;
        while (true) {
    
    
            double xi = 0.5 * (x0 + c / x0);
            if (Math.abs(x0 - xi) < 1e-7) {
    
    
                break;
            }
            x0 = xi;
        }

        return (int) x0;
    }
}

Muchas gracias por leer este artículo ~
Bienvenido a [Me gusta] [Favorito] [Comentario] Ir tres veces seguidas ~
No es difícil darse por vencido, pero debe ser genial ~
Espero que todos podamos mejorar un poco todos los días. ~
Este artículo está escrito por el sombrero blanco del segundo maestro: https://le-yi.blog.csdn.net/Blog original~


Supongo que te gusta

Origin blog.csdn.net/leyi520/article/details/132203921
Recomendado
Clasificación