"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Crónicas de codificación mecanografiada: producto de una matriz excepto uno mismo

Crónicas de codificación mecanografiada: producto de una matriz excepto uno mismo

Publicado el 2024-07-31
Navegar:292

Typescript Coding Chronicles: Product of Array Except Self

Planteamiento del problema:

Dada una matriz de números enteros, devuelve una respuesta de matriz tal que respuesta[i] sea igual al producto de todos los elementos de nums excepto nums[i].

Se garantiza que el producto de cualquier prefijo o sufijo de números cabe en un entero de 32 bits.

Debes escribir un algoritmo que se ejecute en tiempo O(n) y sin utilizar la operación de división.

Ejemplo 1:

  • Entrada: números = [1,2,3,4]
  • Salida: [24,12,8,6]

Ejemplo 2:

  • Entrada: números = [-1,1,0,-3,3]
  • Salida: [0,0,9,0,0]

Restricciones:

  • 2
  • -30
  • Se garantiza que el producto de cualquier prefijo o sufijo de números cabe en un entero de 32 bits.

Hacer un seguimiento:

¿Puedes resolver el problema en O(1) complejidad de espacio adicional? (La matriz de salida no cuenta como espacio adicional para el análisis de complejidad espacial).

Proceso de pensamiento inicial:

Para resolver este problema, necesitamos calcular el producto de todos los elementos excepto el elemento actual sin utilizar la operación de división. Esto se puede hacer usando dos pasadas sobre la matriz:

  1. Calcule los productos de prefijo para cada elemento.
  2. Calcule los productos de sufijo para cada elemento y multiplíquelos con los productos de prefijo.

Solución básica:

Podemos usar dos matrices para almacenar los productos de prefijo y sufijo, luego multiplicarlos para obtener el resultado final.

Código:

function productExceptSelf(nums: number[]): number[] {
    const n = nums.length;
    const prefixProducts = new Array(n).fill(1);
    const suffixProducts = new Array(n).fill(1);
    const result = new Array(n).fill(1);

    // Compute prefix products
    for (let i = 1; i = 0; i--) {
        suffixProducts[i] = suffixProducts[i   1] * nums[i   1];
    }

    // Compute the result by multiplying prefix and suffix products
    for (let i = 0; i 



Análisis de complejidad temporal:

  • Complejidad del tiempo: O(n), donde n es la longitud de la matriz. Repetimos la matriz tres veces.
  • Complejidad espacial: O(n), para almacenar los productos de prefijo y sufijo.

Limitaciones:

La solución básica funciona bien pero utiliza espacio adicional para almacenar productos de prefijo y sufijo.

Solución optimizada:

Podemos optimizar la solución para usar O(1) espacio adicional usando la matriz de salida para almacenar productos de prefijo primero y luego modificarla en el lugar para incluir los productos de sufijo.

Código:

function productExceptSelfOptimized(nums: number[]): number[] {
    const n = nums.length;
    const result = new Array(n).fill(1);

    // Compute prefix products in the result array
    for (let i = 1; i = 0; i--) {
        result[i] = result[i] * suffixProduct;
        suffixProduct *= nums[i];
    }

    return result;
}

Análisis de complejidad temporal:

  • Complejidad del tiempo: O(n), donde n es la longitud de la matriz. Repetimos la matriz dos veces.
  • Complejidad del espacio: O(1), ya que estamos usando la matriz de salida para almacenar resultados intermedios y no usamos ningún espacio adicional.

Mejoras con respecto a la solución básica:

  • La solución optimizada reduce la complejidad del espacio a O(1) mediante el uso de la matriz de salida para resultados intermedios.

Casos extremos y pruebas:

Casos extremos:

  1. La matriz contiene cero(s).
  2. La matriz contiene números negativos.
  3. La longitud de la matriz es el límite mínimo (2) o máximo (10^5).

Casos de prueba:

console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelf([0,0])); // [0,0]
console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelf([1,2])); // [2, 1]

console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelfOptimized([0,0])); // [0,0]
console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelfOptimized([1,2])); // [2, 1]

Estrategias generales para la resolución de problemas:

  1. Comprenda el problema: Lea atentamente el enunciado del problema para comprender los requisitos y restricciones.
  2. Identificar operaciones clave: Determinar las operaciones clave necesarias, como calcular productos de prefijo y sufijo.
  3. Optimizar para mejorar la legibilidad: Utilice una lógica clara y concisa para garantizar que el código sea fácil de seguir.
  4. Pruebe minuciosamente: Pruebe la solución con varios casos, incluidos casos extremos, para garantizar la corrección.

Identificación de problemas similares:

  1. Matriz de suma de prefijos:

    • Problemas en los que es necesario calcular sumas de prefijos para consultas de rango.
    • Ejemplo: Consulta de suma de rango.
  2. Algoritmos locales:

    • Problemas donde las operaciones deben realizarse en el lugar con espacio adicional limitado.
    • Ejemplo: rotar una matriz hacia la derecha en k pasos.
  3. Manipulación de matrices:

    • Problemas en los que es necesario modificar matrices en función de condiciones específicas.
    • Ejemplo: Mover ceros al final de una matriz.

Conclusión:

  • El problema de calcular el producto de una matriz excepto self se puede resolver de manera eficiente utilizando un enfoque básico con espacio adicional y un enfoque optimizado in situ.
  • Comprender el problema y dividirlo en partes manejables es crucial.
  • Usar una lógica clara y optimizar la legibilidad garantiza que la solución sea fácil de seguir.
  • Las pruebas con varios casos extremos garantizan la solidez.
  • Reconocer patrones en los problemas puede ayudar a aplicar soluciones similares a otros desafíos.

Al practicar estos problemas y estrategias, puedes mejorar tus habilidades de resolución de problemas y estar mejor preparado para diversos desafíos de codificación.

Declaración de liberación Este artículo se reproduce en: https://dev.to/__zamora__/typescript-coding-chronicles-product-of-array-except-self-3gg4?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3