Given two arrays, write a
function to compute their intersection.
Example: given nums1 = [1, 2, 2, 1], nums2
= [2, 2], return [2, 2].
·
Each element in the result should appear as many times as it
shows in both arrays.
·
The result can be in any order.
Заданы два массива. Реализуйте
функцию, вычисляющую их пересечение.
Например, если nums1
= [1, 2, 2, 1], nums2 = [2, 2], то функция должна вернуть [2, 2].
·
Каждый элемент в результирующем массиве должен встречаться столько
раз, сколько он встречается в обоих массивах.
·
Числа в результирующем массиве могут располагаться в любом
порядке
// C++
class Solution {
public:
vector<int> intersect(vector<int>&
nums1, vector<int>& nums2) {
}
};
// Java
public class Solution {
public int[]
intersect(int[] nums1, int[]
nums2) {
}
}
сортировка
Отсортируем массивы nums1
и nums2.
Далее воспользуемся двумя бегущими указателями i и j. Установим их оба
на начало массивов: i = j = 0. За линейный проход находим
одинаковые элементы в обоих массивах и заносим их в результирующий массив.
Реализация алгоритма
class Solution
{
public:
vector<int> intersect(vector<int>&
nums1, vector<int>& nums2)
{
vector<int> res;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int i = 0, j = 0;
while((i < nums1.size()) && (j <
nums2.size()))
if (nums1[i] < nums2[j]) i++;
else
if (nums1[i] > nums2[j]) j++;
else
{
res.push_back(nums1[i]);
i++; j++;
}
return res;
}
};
Java реализация
public class Solution
{
public int[]
intersection(int[] nums1, int[] nums2)
{
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList<Integer> s = new
ArrayList<Integer>();
int i = 0, j = 0;
while((i < nums1.length) && (j <
nums2.length))
if (nums1[i] < nums2[j]) i++;
else
if (nums1[i] > nums2[j]) j++;
else
{
s.add(nums1[i]);
i++; j++;
}
int res[] = new int[s.size()];
int k = 0;
for(Integer val : s) res[k++] = val;
return res;
}
}