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. . .