Java - Leetcode Two Sum Hashmap Solution

Soy nuevo en Java y acabo de comenzar a hacer Leetcode - Two Sum. Descubrí que, excepto la solución de fuerza bruta, la solución común es usar Hashmap. Pero todavía no puedo entenderlo. Por ejemplo, esto funciona en mi lógica:

public int[] twoSum(int[] nums, int target) {
    HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
    int[] res = new int[2];
    for (int i = 0; i < nums.length; ++i) {
        m.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; ++i) {
        int t = target - nums[i];
        if (m.containsKey(t) && m.get(t) != i) {
            res[0] = i;
            res[1] = m.get(t);
            break;
        }
    }
    return res;
}

El primer bucle for pone números a Hashmap, y usa el segundo bucle for para verificar si podemos encontrar el número que equivale a target number - nums[i]. Sin embargo, vi que muchas soluciones aceptadas combinaban los dos bucles for, como este ejemplo:

public int[] twoSum(int[] nums, int target) {
    HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
    int[] res = new int[2];
    for (int i = 0; i < nums.length; ++i) {
        if (m.containsKey(target - nums[i])) {
            res[0] = i;
            res[1] = m.get(target - nums[i]);
            break;
        }
        m.put(nums[i], i);
    }
    return res;
}

En mi lógica, la segunda solución ejecuta el bucle for de esta manera:

//[2,7,11,15]
when i=0, m.put(nums[0],2)
when i=1, m.put(nums[1],7)
when i=2, m.put(nums[2],11)
when i=3, m.put(nums[3],15)

Y porque i < nums.lengthasí cuando i = 4, el código saltará a return res. No volverá a ejecutar el bucle for. Pero hasta donde yo sé, vi a la gente decir que la segunda solución iterará a través de la matriz y almacenará el índice y el valor en Hashmap y luego repetirá nuevamente. En mi imaginación, solo hay uno para el bucle, ¿cómo pueden usar el único bucle para iterar nuevamente?

Respuesta 1

No habrá ninguna segunda iteración. En una iteración, el ciclo se rompería si se encuentra un par.

considera esto:

//[2,7,11,15] and target = 13
when i=0, m.put(mums[0],2)
when i=1, m.put(mums[1],7)
when i=2, m.contains(13 - mums[2]) == true // since 13 - 11 = 2 is present at index 0
res[0] = 2
res[1] = 0
break;

y por lo tanto, ... tienes razón. solo hay una iteración.

Respuesta: 2

Estoy tratando de ejecutar un comando: public static void main (String [] args) {int buffer; StringBuilder res = new StringBuilder (); Proceso de proceso; pruebe {proc = Runtime ...

Tengo dos personas que necesito para realizar crossover que son de diferentes longitudes. Los individuos pueden ser así, pero podrían ser mucho más largos: 0 1 2 2 1 2 0 [0] 1 2 1 2 0 1 2 [0] 1 2 1 2 0 2 1 [1] ...

Estoy tratando de devolver a los ganadores de mi juego con los intentos más bajos. Pero no estoy seguro de cómo hacer esto para los casos en que hay un empate. mi para obtener el ganador es probar (Scanner scan = new Scanner (new File ("...

He creado una lista de arrays 2D que tiene un número fijo o filas y una matriz que contiene los números 1-4. Se supone que debo barajar la matriz y luego almacenar esa matriz en la lista de matrices. Sin embargo, cuando voy a ...