Intersection of Two Arrays II
https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ | Easy |
Условие
Даны два массива целых чисел nums1 и nums2. Нужно вернуть массив их пересечения. Каждый элемент в результате должен появляться столько раз, сколько он встречается в обоих массивах. Порядок элементов в результате может быть произвольным.
Примеры
Input:
nums1 = [1, 2, 2, 1], nums2 = [2, 2]Output:
[2, 2]
Input:
nums1 = [4, 9, 5], nums2 = [9, 4, 9, 8, 4]Output:
[4, 9]Explanation:
Результат может быть в любом порядке: [9,4] также является допустимым ответом.
Решение
fun intersect(nums1: IntArray, nums2: IntArray): IntArray {
val map = mutableMapOf<Int, Int>() // Словарь для хранения количества каждого элемента в nums1
val result = mutableListOf<Int>() // Список для хранения результата
// Подсчитываем количество каждого элемента в nums1
for (num in nums1) {
map[num] = map.getOrDefault(num, 0) + 1
}
// Проходим по nums2 и добавляем общие элементы в результат
for (num in nums2) {
if (map.containsKey(num) && map[num]!! > 0) {
result.add(num) // Добавляем элемент в результат
map[num] = map[num]!! - 1 // Уменьшаем счетчик для элемента
}
}
// Преобразуем результат в массив и возвращаем
return result.toIntArray()
}
Временная сложность
O(n + m), где n — длина nums1, а m — длина nums2, так как мы проходим по каждому массиву один раз.
Пространственная сложность
O(min(n, m)), так как в худшем случае результат содержит все элементы из меньшего массива.