¡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
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:
- Primero compare las longitudes de las dos matrices para encontrar la matriz más corta
nums1
- Recorra
nums1
y registre el valor y el número de ocurrencias de cada elemento en la tabla hash - Cree una nueva matriz y devuélvala como resultado, la longitud de la matriz es
nums1
la longitud de - Luego recorra otra matriz
nums2
, paranums2
cada 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
yn
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 esO(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
yn
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 devueltonums
cuya longitud es la longitud de la matriz más corta.
Enviar resultados
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:
- Ordene las dos matrices primero, luego recorra con punteros dobles
- 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
yn
son las longitudes de las dos matrices respectivamente. Crea una matriz para el valor devueltoints
cuya longitud es la longitud de la matriz más corta