1775. Igualar la suma de matrices mediante operaciones mínimas
medio
82
negocio relacionado
nums1
Se le dan dos sumas de matrices de números enteros de longitud posiblemente desigual nums2
. Todos los valores en ambas matrices están 1
entre e 6
inclusive .1
6
En cada operación, puede elegir cualquier número entero en cualquier matriz y convertirlo en cualquier valor entre y ( 1
incluido 6
y ) .1
6
Devuelva el número mínimo de operaciones que igualan la suma nums1
de todos los números y la suma de todos los números. nums2
Retorna si la suma de las dos matrices no puede ser igual -1
.
Ejemplo 1:
Entrada: nums1 = [1,2,3,4,5,6], nums2 = [1,1,2,2,2,2] Salida: 3 Explicación: Puede hacer todos los números en nums1 a 3 operaciones La suma es igual a la suma de todos los números en nums2. Todos los subíndices de las siguientes matrices comienzan desde 0. - Cambie números2[0] a 6. números1 = [1,2,3,4,5,6], números2 = [ 6,1,2,2,2,2 ] . - Cambie números1[5] a 1. números1 = [1,2,3,4,5, 1 ], números2 = [6,1,2,2,2,2] . - Cambie números1[2] a 2. números1 = [1,2,2,4,5,1 ] , números2 = [6,1,2,2,2,2] .
Ejemplo 2:
Entrada: nums1 = [1,1,1,1,1,1,1], nums2 = [6] Salida: -1 Explicación: No hay forma de disminuir la suma de nums1 o aumentar la suma de nums2 para hacerlos igual.
Ejemplo 3:
Entrada: nums1 = [6,6], nums2 = [1] Salida: 3 Explicación: Puede hacer que la suma de todos los números en nums1 sea igual a la suma de todos los números en nums2 hasta 3 operaciones. Todos los subíndices de las siguientes matrices comienzan desde 0. - Cambie números1[0] a 2. números1 = [ 2,6 ], números2 = [1]. - Cambie los números 1[1] a 2. números1 = [2, 2 ], números2 = [1] . - Cambie números2[0] a 4. números1 = [2,2], números2 = [ 4 ].
pista:
1 <= nums1.length, nums2.length <= 105
1 <= nums1[i], nums2[i] <= 6
Pases
9.5K
Envíos
17,8K
Tasa de aprobación
53,4%
Solución: Mi primer pensamiento es, ¿bajo qué circunstancias no pueden ser iguales? Cuando el valor mínimo de una matriz es mayor que el valor máximo de la otra matriz, no hay igualdad.
Otra pregunta, ¿cómo podemos estar seguros de que deben ser iguales? Cuando la diferencia entre la suma de las dos matrices está dentro del rango máximo que las dos matrices pueden ajustar, deben ser iguales.
¿Cuál es entonces el rango máximo de ajuste? Suponiendo que la suma de la matriz 1 es mayor que la suma de la matriz 2, entonces la matriz 1 debe disminuirse y la matriz 2 debe aumentarse. El valor máximo de disminución es 6->1 5->1 4->1 3->1 2->1; el valor máximo de aumento es 1->6 2->6 3->6 4->6 5 - >6; Por lo tanto, es natural pensar en hashmap, contar el número de apariciones de cada número y calcular el rango máximo de ajuste.
Si hay una solución, ¿cómo es la más rápida? Pensando en el problema del cambio, utilice el método codicioso y ajuste de acuerdo con 5 4 3 2 1.
Aquí está el código:
class Solution {
public:
int minOperations(vector<int>& nums1, vector<int>& nums2) {
int ret=0;
int len1=nums1.size();
int len2=nums2.size();
if(len1<len2)
{
if(len1*6<len2)
{
return -1;
}
}
if(len2<len1)
{
if(len2*6<len1)
{
return -1;
}
}
int sum1=accumulate(nums1.begin(), nums1.end(), 0);
int sum2=accumulate(nums2.begin(), nums2.end(), 0);
int count1[7]={0};
int count2[7]={0};
for(auto i:nums1)
{
count1[i]++;
}
for(auto i:nums2)
{
count2[i]++;
}
if(sum1==sum2)
{
return 0;
}
else if(sum1>sum2)
{
// to do
int diff=sum1-sum2;
int charge[6]={0};
charge[5]=count1[6]+count2[1];
charge[4]=count1[5]+count2[2];
charge[3]=count1[4]+count2[3];
charge[2]=count1[3]+count2[4];
charge[1]=count1[2]+count2[5];
int chargeMax=5*charge[5]+4*charge[4]+3*charge[3]+2*charge[2]+charge[1];
if(diff>chargeMax)
return -1;
int need5=diff/5;
int yushu5=diff%5;
if(need5<=charge[5])
{
diff=yushu5;
ret+=need5;
charge[4]+=(charge[5]-need5);
}
else
{
diff-=charge[5]*5;
ret+=charge[5];
}
int need4=diff/4;
int yushu4=diff%4;
if(need4<=charge[4])
{
diff=yushu4;
ret+=need4;
charge[3]+=(charge[4]-need4);
}
else
{
diff-=charge[4]*4;
ret+=charge[4];
}
int need3=diff/3;
int yushu3=diff%3;
if(need3<=charge[3])
{
diff=yushu3;
ret+=need3;
charge[2]+=(charge[3]-need3);
}
else
{
diff-=charge[3]*3;
ret+=charge[3];
}
int need2=diff/2;
int yushu2=diff%2;
if(need2<=charge[2])
{
diff=yushu2;
ret+=need2;
charge[1]+=(charge[2]-need3);
}
else
{
diff-=charge[2]*2;
ret+=charge[2];
}
ret+=diff; // 最后只剩1了
return ret;
}
else
{
int diff=sum2-sum1;
int charge[6]={0};
charge[5]=count2[6]+count1[1];
charge[4]=count2[5]+count1[2];
charge[3]=count2[4]+count1[3];
charge[2]=count2[3]+count1[4];
charge[1]=count2[2]+count1[5];
int chargeMax=5*charge[5]+4*charge[4]+3*charge[3]+2*charge[2]+charge[1];
if(diff>chargeMax)
return -1;
int need5=diff/5;
int yushu5=diff%5;
if(need5<=charge[5])
{
diff=yushu5;
ret+=need5;
charge[4]+=(charge[5]-need5);
}
else
{
diff-=charge[5]*5;
ret+=charge[5];
}
int need4=diff/4;
int yushu4=diff%4;
if(need4<=charge[4])
{
diff=yushu4;
ret+=need4;
charge[3]+=(charge[4]-need4);
}
else
{
diff-=charge[4]*4;
ret+=charge[4];
}
int need3=diff/3;
int yushu3=diff%3;
if(need3<=charge[3])
{
diff=yushu3;
ret+=need3;
charge[2]+=(charge[3]-need3);
}
else
{
diff-=charge[3]*3;
ret+=charge[3];
}
int need2=diff/2;
int yushu2=diff%2;
if(need2<=charge[2])
{
diff=yushu2;
ret+=need2;
charge[1]+=(charge[2]-need3);
}
else
{
diff-=charge[2]*2;
ret+=charge[2];
}
ret+=diff; // 最后只剩1了
return ret;
}
}
};
Tiempo 96 ms
derrotar
94,59%
RAM111MB
derrotar
91,89%