# 349. Intersection of Two Arrays

## Description

Given two integer arrays nums1 and nums2, return an array of their intersection. Each element in the result must be unique and you may return the result in any order.

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]


Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]
Explanation: [4,9] is also accepted.


Constraints:

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

## Solutions

Use a HashSet to put all nums1 in, and then traverse the elements of nums2. If it exists in the HashSet, it means that it is the intersection part, add it to the HashSet of the result, and finally convert the result to the form of a vector.

Or, use two pointers to do it, first sort the two arrays, then use the two pointers to point to the beginning of the two arrays respectively, then compare the size of the two arrays, move the pointer of the small number backward, if the two pointers point to The numbers are equal, add this number to the result.

## Python set() operations

Python uses the & operator for intersection, and various methods like .intersection(), to find common elements between sets. Here’s how you can perform set operations in Python:

### Intersection (Common elements in both sets)

• Using the & operator:
set1 = {1, 2, 3}
set2 = {2, 3, 4}
intersection = set1 & set2
print(intersection)  # Output: {2, 3}

• Using the .intersection() method:
intersection = set1.intersection(set2)
print(intersection)  # Output: {2, 3}


### Union (All elements from both sets, without duplication)

• Using the | operator:
union = set1 | set2
print(union)  # Output: {1, 2, 3, 4}

• Using the .union() method:
union = set1.union(set2)
print(union)  # Output: {1, 2, 3, 4}


### Difference (Elements in the first set but not in the second)

• Using the - operator:
difference = set1 - set2
print(difference)  # Output: {1}

• Using the .difference() method:
difference = set1.difference(set2)
print(difference)  # Output: {1}


### Symmetric Difference (Elements in either of the sets, but not in both)

• Using the ^ operator:
symmetric_difference = set1 ^ set2
print(symmetric_difference)  # Output: {1, 4}

• Using the .symmetric_difference() method:
symmetric_difference = set1.symmetric_difference(set2)
print(symmetric_difference)  # Output: {1, 4}


These are some of the basic set operations supported in Python, which allow for efficient computation on sets, utilizing their inherent properties to perform operations like intersection, union, difference, and symmetric difference.

• class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
boolean[] s = new boolean[1001];
for (int x : nums1) {
s[x] = true;
}
List<Integer> ans = new ArrayList<>();
for (int x : nums2) {
if (s[x]) {
s[x] = false;
}
}
return ans.stream().mapToInt(Integer::intValue).toArray();
}
}

• class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
bool s[1001];
memset(s, false, sizeof(s));
for (int x : nums1) {
s[x] = true;
}
vector<int> ans;
for (int x : nums2) {
if (s[x]) {
ans.push_back(x);
s[x] = false;
}
}
return ans;
}
};

• class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))

############

# counting
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
cnt = Counter(nums1 + nums2)
return [x for x in arr1 if cnt[x] == 2]

############

'''
https://docs.python.org/3/reference/expressions.html#operator-precedence

high to low:

**

*, @, /, //, %

+, -

<<, >>

&

^

|

in, not in, is, is not, <, <=, >, >=, !=, ==

and

or

if – else

'''
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
s = set(nums1)
res = set()
for num in nums2:
if num in s:
return list(res)

############

# no extra space
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
ans = []
nums1.sort()
nums2.sort()
i = j = 0
while i < len(nums1) and j < len(nums2):
if nums1[i] < nums2[j]:
i += 1
elif nums1[i] > nums2[j]:
j += 1
else:
# ans.append(nums1[i]) # for Leetcode 350, input with duplicates
if (not ans) or (len(ans) > 0 and ans[-1] != nums1[i]):
ans.append(nums1[i])
i += 1
j += 1

return ans

############

class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
d = {}
ans = []
for num in nums1:
d[num] = d.get(num, 0) + 1

for num in nums2:
if num in d:
ans.append(num)
del d[num]
return ans


• func intersection(nums1 []int, nums2 []int) (ans []int) {
s := [1001]bool{}
for _, x := range nums1 {
s[x] = true
}
for _, x := range nums2 {
if s[x] {
ans = append(ans, x)
s[x] = false
}
}
return
}

• /**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function (nums1, nums2) {
const s = Array(1001).fill(false);
for (const x of nums1) {
s[x] = true;
}
const ans = [];
for (const x of nums2) {
if (s[x]) {
ans.push(x);
s[x] = false;
}
}
return ans;
};


• class Solution {
/**
* @param Integer[] $nums1 * @param Integer[]$nums2
* @return Integer[]
*/
function intersection($nums1,$nums2) {
$rs = [];$set1 = array_values(array_unique($nums1));$set2 = array_values(array_unique($nums2)); for ($i = 0; $i < count($set1); $i++) {$hashmap[$set1[$i]] = 1;
}
for ($j = 0;$j < count($set2);$j++) {
if ($hashmap[$set2[$j]]) { array_push($rs, $set2[$j]);
}
}
return \$rs;
}
}

• public class Solution {
public int[] Intersection(int[] nums1, int[] nums2) {
List<int> result = new List<int>();
HashSet<int> arr1 = new(nums1);
HashSet<int> arr2 = new(nums2);
foreach (int x in arr1) {
if (arr2.Contains(x)) {
}
}
return result.ToArray();
}
}


• function intersection(nums1: number[], nums2: number[]): number[] {
const s = new Set(nums1);
return [...new Set(nums2.filter(x => s.has(x)))];
}