Producto de matrices distintas de sí misma (explicación detallada en lenguaje c)

Tema: Producto de matrices excepto él mismo.

        Dada una matriz entera nums , devuelve la matriz respuesta , donde respuesta[i] es igual al producto de los elementos restantes en nums excepto nums[i] .

Los datos de la pregunta garantizan que el producto de todos los elementos de prefijo y sufijos de cualquier elemento en la matriz nums esté dentro del rango de enteros de 32 bits.

No utilice la división y complete este problema dentro de una complejidad de tiempo O (n) .

pista:

 2 <= números.longitud <= 10^5

-30 <= números[i] <= 30

Asegúrese de que el producto de todos los elementos de prefijo y sufijos de cualquier elemento de la matriz esté dentro del rango de números enteros de 32 bits;

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]

Ideas para resolver problemas:

Defina dos matrices (matriz de productos de prefijo y matriz de productos de sufijo) , la matriz de prefijo es: izquierda [] , la matriz de sufijo: derecha [];

La izquierda [i] almacena la suma de productos antes de nums [i] y la derecha [i] almacena la suma de productos después de nums [i] (almacena 1 cuando está vacío);

Cree una variable de memoria dinámica int* ret=(int*)malloc(sizeof(int)*numsSize);

Luego ret [i] = izquierda [i] * derecha [i], regresa después del almacenamiento;

Implementación de ideas:

Porque elementos de la matriz : 2 <= nums.lengh <= 10^5

Por lo tanto, los tamaños de matriz solicitados para matrices de prefijo y sufijo son 10^5;

int left[100000]={0};
int right[100000]={0};

Luego es atravesar los valores de la matriz de productos de prefijo:

    //前缀乘积和
    for(i=0;i<numsSize;i++)
    {
        if(i==0)
        {
            left[i]=1;
        }
        else
        {
            left[i]=left[i-1]*nums[i-1];
        }
    }

Análisis:

Aquí usamos la matriz números [1, 2, 3, 4, 5, 6] como ejemplo; 

En este momento, izquierda [ 0 ] = 1, luego izquierda [ 1 ] = izquierda [ 0 ] * nums [ 0 ] es equivalente a izquierda [ 1 ] = nums [ 0 ];

izquierda [2] = izquierda [1] * números [1] izquierda [2] = números [0] * números [1];

izquierda [3] = izquierda [2] * números [2] izquierda [3] = números [0] * números [1] * números [2];

。。。。。。

izquierda [ 5 ] = izquierda [ 4 ] * números [ 4 ] 相当于 izquierda [ 5 ] = números [ 0 ] * números [ 1 ] * números [ 2 ] * números [ 3 ] * números [ 4 ] ;

Creo que todos han encontrado el patrón;

Luego es atravesar los valores de la matriz de productos de sufijo:

   //后缀乘积和
    for(i=numsSize-1;i>=0;i--)
    {
        if(i==numsSize-1)
        {
            right[i]=1;
        }
        else
        {
            right[i]=right[i+1]*nums[i+1];
        }
    }

Análisis:

De manera similar: números [1, 2, 3, 4, 5, 6]

izquierda [ 5 ] = 1, luego izquierda [ 4 ] = izquierda [ 5 ] * números [ 5 ] es equivalente a izquierda [ 4 ] = números [ 5 ];

izquierda [3] = izquierda [4] * números [4] izquierda [3] = números [4] * números [5];

izquierda [2] = izquierda [3] * números [3] 相当于 izquierda [2] = números [3] * números [4] * números [5];

。。。。。。

izquierda [ 0 ] = izquierda [ 1 ] * números [ 1 ] 相当于 izquierda [ 0 ] = números [ 1 ] * números [ 2 ] * números [ 3 ] * números [ 4 ] * números [ 5 ] ;

Luego es asignar un valor al valor de retorno (* returnSize), crear un interno dinámico (ret), asignarle un valor y luego regresar;

    * returnSize=numsSize;
    int* ret=(int*)malloc(4*numsSize);
    //给返回指针赋值
    for(i=0;i<numsSize;i++)
    {
        ret[i]=left[i]*right[i];
    }

La complejidad del tiempo es (O(N));

Esta es la idea básica de esta pregunta, el siguiente es el código fuente del programa:

int* productExceptSelf(int* nums, int numsSize, int* returnSize){
    int i=0;
    int left[100000]={0};
    int right[100000]={0};
    //前缀乘积和
    for(i=0;i<numsSize;i++)
    {
        if(i==0)
        {
            left[i]=1;
        }
        else
        {
            left[i]=left[i-1]*nums[i-1];
        }
    }
    //后缀乘积和
    for(i=numsSize-1;i>=0;i--)
    {
        if(i==numsSize-1)
        {
            right[i]=1;
        }
        else
        {
            right[i]=right[i+1]*nums[i+1];
        }
    }
    * returnSize=numsSize;
    int* ret=(int*)malloc(4*numsSize);
    //给返回指针赋值
    for(i=0;i<numsSize;i++)
    {
        ret[i]=left[i]*right[i];
    }
    return ret;
}

Si hay alguna deficiencia, ¡no dude en complementarla y comunicarla!

fin. . .


        

Supongo que te gusta

Origin blog.csdn.net/m0_71676870/article/details/132303752
Recomendado
Clasificación