Pregunta diaria: Intersección de dos matrices||

¡Acostúmbrate a escribir juntos! Este es el octavo día de mi participación en el "Nuggets Daily New Plan·Desafío de actualización de abril", haz clic para ver los detalles del evento 

enlace de tema

nums1 Dada la suma  de dos matrices enteras  nums2 , devuelva la intersección de las dos matrices como una matriz. El número de ocurrencias de cada elemento en el resultado devuelto debe ser el mismo que el número de veces que el elemento aparece en ambas matrices ( si el número de ocurrencias es inconsistente, se considera el valor más pequeño ). El orden de los resultados de salida se puede ignorar.

Ejemplo 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
复制代码

Ejemplo 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
复制代码

  insinuación:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

Ideas para resolver problemas: (tabla hash)

Esta pregunta es similar a una pregunta que escribí antes. Si está interesado, puede hacer esa pregunta primero, luego haga esta pregunta, la intersección de dos matrices |

Debido a que esta pregunta no requiere que los elementos de la matriz no sean repetitivos, lo que significa que un elemento puede aparecer varias veces en la matriz, necesitamos usar una tabla hash para registrar la cantidad de veces que aparece el elemento en la matriz . El número de ocurrencias de un elemento debe ser el mínimo de sus ocurrencias en las dos matrices

Y debido a que la longitud de la intersección de las dos matrices no debe exceder la longitud de la matriz más corta , primero recorremos la matriz más corta y registramos el número de ocurrencias de cada elemento y elemento en la tabla hash.

Ideas específicas:

  1. Primero compare las longitudes de las dos matrices para encontrar la matriz más cortanums1
  2. Recorra nums1y registre el valor y el número de ocurrencias de cada elemento en la tabla hash
  3. Cree una nueva matriz y devuélvala como resultado, la longitud de la matriz es nums1la longitud de
  4. Luego recorra otra matriz nums2, para nums2cada elemento en la tabla hash, si se puede encontrar en la tabla hash, agregue el elemento a la matriz de resultados y reduzca el número de ocurrencias de este elemento en la tabla hash

Código: (implementación JAVA)

public int[] intersect(int[] nums1, int[] nums2) {
        if (nums1.length > nums2.length) {
            return intersect(nums2,nums1);
        }
        HashMap<Integer,Integer> hashmap = new HashMap<>();
        for (int i : nums1) {
            //这里的count就是每个元素出现的次数,后面的+1是为了保证添加进哈希表的元素至少有一次
            int count = hashmap.getOrDefault(i,0)+1;
            hashmap.put(i,count);
        }

        int[] nums = new int[nums1.length];
        //记录结果数组元素的个数
        int index = 0;
        for (int i : nums2) {
            int count = hashmap.getOrDefault(i,0);
            if (count > 0) {
                nums[index] = i;
                index++;
                count--;
                if (count > 0) {
                    hashmap.put(i,count);
                }else {
                    hashmap.remove(i);
                }
            }
        }
       
        return Arrays.copyOfRange(nums,0,index);
复制代码

Análisis de Complejidad

  • Complejidad de tiempo: O(M+N) , donde  m y  n son las longitudes de las dos matrices respectivamente. Necesita atravesar dos matrices y operar en la tabla hash, la complejidad de tiempo de la operación de la tabla hash es  O(1), por lo que la complejidad de tiempo total es lineal con la suma de las longitudes de las dos matrices.
  • Complejidad espacial: O(min(M,N)) , donde  m y  n son las longitudes de las dos matrices respectivamente. Las operaciones de la tabla hash se realizan en matrices más cortas y el tamaño de la tabla hash no excederá la longitud de la matriz más corta. Crea una matriz para el valor devuelto  numscuya longitud es la longitud de la matriz más corta.

Enviar resultados

imagen.png

Ideas para resolver problemas: (ordenar + doble puntero)

Si las dos matrices están ordenadas , podemos atravesar los dos punteros para obtener la intersección de las matrices

Ideas específicas:

  1. Ordene las dos matrices primero, luego recorra con punteros dobles
  2. Al principio, los dos punteros apuntan al principio de las dos matrices, respectivamente, y comparan si los elementos a los que apuntan los punteros son iguales. Si los dos punteros son iguales, los elementos se agregan a la matriz resultante y las matrices se mueven un bit hacia atrás al mismo tiempo. Si no son iguales, los elementos se comparan. El puntero pequeño se mueve hacia atrás un bit, y cuando al menos un puntero excede el rango de la matriz, el recorrido termina

Código: (implementación JAVA)

public static int[] intersect(int[] nums1,int[] nums2) {
    Arrays.sort(nums1);
    Arrays.sort(nums2);
    int l1 = nums1.length;
    int l2 = nums2.length;

    int[] ints = new int[Math.min(l1,l2)];

    int nums1_index = 0;
    int nums2_index = 0;
    int ints_index = 0;

    while (nums1_index < l1 && nums2_index < l2) {
        if (nums1[nums1_index] < nums2[nums2_index]) {
            nums1_index++;
        }else if (nums1[nums1_index] > nums2[nums2_index]) {
            nums2_index++;
        }else {
            ints[ints_index++] = nums2[nums2_index];
            nums1_index++;
            nums2_index++;
        }
    }

    return Arrays.copyOfRange(ints,0,ints_index);
}
复制代码

Análisis de Complejidad:

  • Complejidad del tiempo: O(mlogm+nlogn)
  • Complejidad espacial: O(min(m,n)) , donde  m y  n son las longitudes de las dos matrices respectivamente. Crea una matriz para el valor devuelto  intscuya longitud es la longitud de la matriz más corta

Enviar resultados

imagen.png

Supongo que te gusta

Origin juejin.im/post/7084920623515828254
Recomendado
Clasificación