LeetCode Elementary Algorithm Training-Sorting and Search (Completado)

Introducción

Previous: Árbol de entrenamiento del algoritmo primario de LeetCode

Siguiente: Programación dinámica de entrenamiento de algoritmo elemental LeetCode

Originalmente quería comenzar con el nivel principiante e intermedio y los algoritmos de entrevistas corporativas, pero al final optamos por comenzar desde lo básico, porque no cepillamos preguntas con el propósito de cepillar preguntas, sino ejercitar una especie de algoritmo pensando en el proceso de cepillado de preguntas, después de mucho entrenamiento. Forme una visión única del algoritmo, cultive la sensibilidad al algoritmo, vea el problema, un plan para resolver el problema puede aparecer en el cerebro y, lentamente, genere confianza desde el principio, y esto también es para el complejo algoritmo detrás Sentar las bases para ideas de resolución de problemas.

Introducción al algoritmo primario de LeetCode

Si también quieres entrenar tu propio pensamiento algorítmico, también puedes unirte a mí, comenzando desde el algoritmo elemental, inicia tu viaje del algoritmo: algoritmo elemental .

Un poco de su propio pensamiento: no mire la respuesta después de leer la pregunta y luego recite la pregunta, de modo que la memoria del algoritmo implementado no sea fuerte, debe tener su propio pensamiento; y no escriba sobre IDEA al principio, Asegúrese de intentar escribirlo en la pizarra proporcionada por leetCode y finalmente colóquelo en IDEA para ver si hay algún problema, a fin de consolidar su uso y competencia básica de API; otro punto es ser audaz, no el costo de prueba y error en la entrevista Baja, intenta incorporar nuestras ideas al código.

Debido a problemas de espacio, el blog solo enumera ejemplos y sus propias respuestas de resolución de problemas. Para obtener más detalles, puede hacer clic directamente en el tema para ver.

Combinar dos matrices ordenadas

Déle dos matrices de enteros ordenados nums1 y nums2, por favor combine nums2 en nums1 para hacer de nums1 una matriz ordenada.

Descripción:
inicializa el número de elementos de nums1 y nums2 am y n respectivamente.
Puede asumir que nums1 tiene suficiente espacio (el tamaño del espacio es mayor o igual que m + n) para almacenar los elementos en nums2.

Ejemplo:
Entrada:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Salida: [1,2,2,3,5,6 ]

El
primer método es más fácil de pensar, pero la complejidad del tiempo es más lenta. No se utilizan las características ordenadas de los dos datos.

class Solution {
  public void merge(int[] nums1, int m, int[] nums2, int n) {
    System.arraycopy(nums2, 0, nums1, m, n);
    Arrays.sort(nums1);
  }
}

La segunda forma es crear una nueva matriz y mover los datos de nums1 a nums3, usar un puntero doble para comparar los datos de las dos matrices e insertarlos en nums1 y finalmente copiar los datos restantes a nums1.

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums3 = new int[m];
        System.arraycopy(nums1, 0, nums3, 0, m);

        int p = 0;
        int p1 = 0, p2 = 0;

        while (p1 < m && p2 < n) {
            nums1[p++] = nums3[p1] <= nums2[p2] ? nums3[p1++] : nums2[p2++];
        }

        if (p1 < m)
            System.arraycopy(nums3, p1, nums1, p1 + p2, m + n - p1 - p2);
        if (p2 < n)
            System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
    }
}
La primera versión incorrecta

La primera versión incorrecta.
Usted es gerente de producto y actualmente dirige un equipo para desarrollar un nuevo producto. Desafortunadamente, la última versión de su producto no pasó la inspección de calidad. Dado que cada versión se desarrolla basándose en la versión anterior, todas las versiones posteriores a la versión incorrecta son incorrectas.

Suponga que tiene n versiones [1, 2,…, n] y desea encontrar la primera versión incorrecta que causó que todas las versiones posteriores fallaran.

Puede llamar a la interfaz bool isBadVersion (versión) para determinar si el número de versión version es incorrecto en la prueba unitaria. Implemente una función para encontrar la primera versión incorrecta. Debe minimizar la cantidad de llamadas a la API.

Ejemplo:
Dado n = 5, y la versión = 4 es la primera versión incorrecta.

Llamar a isBadVersion (3) ->
llamada falsa a isBadVersion (5) ->
llamada verdadera a isBadVersion (4) -> verdadero

Entonces, 4 es la primera versión incorrecta.

Usando la búsqueda binaria, cuando el límite izquierdo y el límite son iguales, ese número es el número que encontramos.

/* The isBadVersion API is defined in the parent class VersionControl.
      boolean isBadVersion(int version); */

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int left = 1;
        int right = n;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(isBadVersion(mid)){
                right = mid;
            } else{
                left = mid + 1;
            }
        }
        return left;
    }

}

22/22 casos de prueba aprobados
Estado: Aprobado Tiempo de
ejecución: 16 ms
Consumo de memoria: 36,6 MB

Tomó 16ms para ambos puntos, y mucho menos atravesar desde el principio.

Supongo que te gusta

Origin blog.csdn.net/u011148116/article/details/107821710
Recomendado
Clasificación