leetcode 1775. Hacer que la suma de matrices sea igual mediante el menor número de operaciones (equivalente al problema de cambio)

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

En cada operación, puede elegir   cualquier número entero en  cualquier matriz y convertirlo en cualquier  valor entre y (  1 incluido  6 y   )  .16

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

Supongo que te gusta

Origin blog.csdn.net/weixin_41579872/article/details/128216256
Recomendado
Clasificación