Likou 888 Fair Candy Bar Exchange

Título original: 888. Fair Candy Bar Exchange

Alice y Bob tienen barras de chocolate de diferentes tamaños: A [i] es el tamaño de la barra de chocolate i-ésima propiedad de Alice, y B [j] es el tamaño de la barra de chocolate j-ésima propiedad de Bob.

Como son amigos, quieren intercambiar una barra de chocolate, de modo que después del intercambio, todos tengan la misma cantidad total de caramelos. (La cantidad total de dulces que posee una persona es la suma de los tamaños de las barras de dulce que posee).

Devuelve una matriz entera ans, donde ans [0] es el tamaño de la barra de chocolate que Alice debe intercambiar, y ans [1] es el tamaño de la barra de chocolate que Bob debe intercambiar.

Si hay varias respuestas, puede devolver cualquiera de ellas. Asegúrese de que exista la respuesta.

Ejemplo 1:

Entrada: A = [1,1], B = [2,2]
Salida: [1,2]
Ejemplo 2:

Entrada: A = [1,2], B = [2,3]
Salida: [1,2]
Ejemplo 3:

Entrada: A = [2], B = [1,3]
Salida: [2,3]
Ejemplo 4:

Entrada: A = [1,2,5], B = [2,4]
Salida: [5,4]
 

inmediato:

1 <= A. longitud <= 10000
1 <= B. longitud <= 10000
1 <= A [i] <= 100000
1 <= B [i] <= 100000 para
garantizar que la cantidad total de dulces para Alice y Bob es diferente.
La respuesta definitivamente existe.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/fair-candy-swap Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

 

Puntos clave: 1. Cambie solo una vez. 2. La respuesta debe existir, es decir, debe haber una solución, y no hay situación en la que no haya solución por muy intercambiada. 3. El monto total de las dos personas antes del intercambio es diferente, y no es necesario considerar la situación de que el monto total antes del intercambio es el mismo. 4. La longitud de A y B puede ser diferente, pero no deben estar vacías.

 

Análisis: Después del intercambio, Alice y Bob tienen la misma cantidad total de caramelos, es decir, la suma de A es la misma que la suma de B después del intercambio. Primero puede encontrar la suma de A y B respectivamente, y buscar un elemento de A y B, de modo que después de intercambiarlos, la suma de los nuevos A y B sean iguales. Por ejemplo, A = [a, b, c], B = [d, e]. Después de intercambiar by d, A = [a, d, c], B = [b, e] y a + d + c = b + e.

         Primero encuentre las sumas sumA y sumB de A y B, calcule la diferencia diff = sumB-sumA, atraviese A y B, encuentre cada elemento para satisfacer su diferencia es la mitad de la diferencia (los elementos de A y B cambiarán, entonces A y La diferencia entre la suma antes y después del cambio de B es el doble de la de los dos elementos intercambiados). Para simplificarlo, atraviese el elemento a de A y juzgue si a + 0.5 * diff existe en B. En este momento, el La suma de B puede ser cuando se usa una colección para almacenar elementos únicos.

class Solution {
public:
    vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
        int sumA=0;
        int sumB=0;
        unordered_set<int> setB;
        vector<int> ans;
        for(int i=0;i<A.size();i++){
            sumA+=A[i];//求和A
        }
        for(int i=0;i<B.size();i++){
            sumB+=B[i];//求和B
            if (setB.find(B[i])==setB.end())
                setB.insert(B[i]);//建立B的集合
                //setB.emplice(B[i]);
        }
        int diff=sumB-sumA;//计算差值
        for(int i=0;i<A.size();i++){
            if (setB.find(A[i]+0.5*diff)!=setB.end()){//如果存在
                ans.push_back(A[i]);
                ans.push_back(A[i]+0.5*diff);
                break;
            }
        }
        return ans;
    }
};

Se dice que emplice no usa variables intermedias, pero se encuentra que en lugar de insertar, el tiempo y el espacio se han incrementado.

 

Supongo que te gusta

Origin blog.csdn.net/qq_36614557/article/details/113533237
Recomendado
Clasificación