Práctica diaria de preguntas de algoritmo --- Día 83: Intersección de dos matrices II

¡Acostúmbrate a escribir juntos! Este es el día 17 de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

1. Descripción del problema

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 aparece el elemento 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.

Enlace temático: Intersección de dos arreglos II

En segundo lugar, los requisitos de la materia.

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]
复制代码

visitar

1.暴力、哈希
2.建议用时15~30min
复制代码

3. Análisis de problemas

1. Leyes de violencia

En términos generales, la computadora 1 puede ejecutar 1 mi + 8 1e + 8 veces, el alcance de esta pregunta es 1 mi + 3 1e + 3 , el bucle for doble no se agotará, primero vendrá violentamente para participar en una ola.

Solo necesito iterar a través de una matriz primero si nums elementos están dentro de nums2.

Si es así, inserte el valor en la tercera matriz y establezca el valor de nums2 en -1 para evitar la duplicación.

2. hachís

3.gif

Cada elemento de la matriz en la pregunta no es único, primero use una tabla hash para almacenar la cantidad de veces que aparece nums1.

Recorra nums2 para encontrar si el número ha aparecido en la tabla hash, si es -1, almacene los datos.

En cuarto lugar, la implementación de la codificación.

1. Leyes de violencia

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int i,j,m=nums1.size(),n=nums2.size();//初始化数据
        vector<int>v;
        for(i=0;i<m;i++)//遍历其中一个数组
        {
            for(j=0;j<n;j++)
            {
                if(nums1[i]==nums2[j])//如果相等
                {
                    v.push_back(nums1[i]);//插入第三个数组
                    nums2[j]=-1;//置为-1
                    break;//退出这层循环
                }
            }
        }
        return v;
    }
};
复制代码

2. hachís

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        int i;//初始化数据
        vector<int>v;
        map<int,int>m;//哈希计数
        for(i=0;i<nums1.size();i++)//遍历其中一个数组
            m[nums1[i]]++;
        for(i=0;i<nums2.size();i++)//判断第二个数组
        {
            if(m[nums2[i]]>0)//存在数据
            {
                v.push_back(nums2[i]);//存储
                m[nums2[i]]--;//计数-1
            }
        }
        return v;
    }
};
复制代码

5. Resultados de la prueba

1.png

2.png

El tiempo de ejecución se reduce a la mitad, lo que se denomina sacrificar espacio por tiempo.

Supongo que te gusta

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