870 ventaja barajar (codicioso)

1. Descripción del problema:

Dadas dos matrices A y B de igual tamaño, la ventaja de A sobre B puede describirse por el número de índices i que satisfacen A [i]> B [i].

Devuelva cualquier arreglo de A para maximizar su ventaja sobre B.

Ejemplo 1:

Entrada: A = [2,7,11,15], B = [1,10,4,11]
Salida: [2,11,7,15]
Ejemplo 2:

Entrada: A = [12,24,8,32], B = [13,25,32,11]
Salida: [24,32,8,12]

Consejos:

1 <= A.length = B.length <= 10000
0 <= A [i] <= 10 ^ 9
0 <= B [i] <= 10 ^ 9

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/advantage-shuffle

2. Análisis de pensamiento:

① En primer lugar, debe comprender el problema claramente. Puede saber que lo que tenemos que resolver es la combinación de la probabilidad máxima de ganar después de emparejar los elementos en A y B. El retorno es la disposición A de los elementos en B. De hecho, es simplemente la historia clásica que hemos escuchado antes: las carreras de caballos de Tian Ji, puedes ir a la Enciclopedia Baidu para verificar estos materiales y está muy claro lo que significa el título

② Este tipo de problema nos hace pensar en usar una estrategia codiciosa. Esperamos usar esa estrategia para hacer que el elemento actual en A sea lo más grande posible en el B actual, si el elemento actual en A no es mayor que B Elemento, luego intente hacer coincidir el siguiente elemento en A con el elemento en B antes

Actually En realidad, es relativamente fácil de entender en el código proporcionado por el funcionario. Es una estrategia tan codiciosa que vale la pena aprender. Su método de implementación básico es el siguiente:

1) Clone la matriz A y la matriz B, ya que la matriz antes de la clasificación debe usarse en el proceso final de generación de respuestas, la respuesta se genera de acuerdo con el orden de la matriz B anterior

2) Ordene las matrices A y B clonadas. Después de la clasificación, es fácil encontrar la relación de tamaño de los elementos de la matriz AB. La estructura de datos Map <Integer, Deque <Integer >> se utiliza para la asignación, y la clave es el valor del elemento de la matriz B actual. , El valor es el valor del elemento de la matriz A que actualmente coincide con la matriz B, ¿por qué usar una cola de doble extremo? Debido a que los elementos de la matriz están duplicados, puede haber múltiples elementos idénticos (también puede usar una cola, siempre que se cumpla la función de primero en entrar, primero en salir). En este momento, si necesita asignar a mapa, si el valor es un tipo de datos ordinario, es el mismo El valor de la clave (el mismo elemento existe en B) puede sobrescribirse, por lo tanto, use una cola para almacenar el elemento para evitar este problema

3) Use una variable para registrar la posición coincidente en la matriz B actual, atraviese la matriz A en el bucle, cuando los elementos de la matriz A sean más grandes que los elementos de la matriz B, asigne los elementos coincidentes actualmente al mapa, la matriz B coincide Mueva la posición hacia abajo un bit, si no es mayor, únala en otra cola, ya que estos elementos no coinciden con los elementos actuales de B, es mejor tratar con estos elementos que no coinciden en la cola

4) Finalmente, verifique la relación de mapeo del mapa en el bucle, encuentre cuáles son los elementos en A con los que el elemento actual coincide con B y genere la disposición del proceso transversal. De hecho, todo el proceso es relativamente fácil de entender. La mejor manera de depurar es depurar , Lo que facilitará la comprensión del proceso

3. El código es el siguiente:

El código oficial es el siguiente:

class Solution {
    public int[] advantageCount(int[] A, int[] B) {
        int[] sortedA = A.clone();
        Arrays.sort(sortedA);
        int[] sortedB = B.clone();
        Arrays.sort(sortedB);
        Map<Integer, Deque<Integer>> assigned = new HashMap();
        for (int b: B) assigned.put(b, new LinkedList());
        Deque<Integer> remaining = new LinkedList();
        int j = 0;
        for (int a: sortedA) {
            if (a > sortedB[j]) {
                assigned.get(sortedB[j++]).add(a);
            } else {
                remaining.add(a);
            }
        }
        int[] ans = new int[B.length];
        for (int i = 0; i < B.length; ++i) {
            if (assigned.get(B[i]).size() > 0)
                ans[i] = assigned.get(B[i]).pop();
            else
                ans[i] = remaining.pop();
        }
        return ans;
    }
}

 

569 artículos originales publicados · Me gusta 153 · Visitas 590,000+

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/105340874
Recomendado
Clasificación