两个数组的交集2


两个数组的交集2

题目

1
2
3
4
5
6
7
8
9
10
11
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集
返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)
不考虑输出结果的顺序

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
思路:
遍历第一个数组,数组值作为map的下标,map的值为每个值出现的次数
遍历第二个数组,判断值是否在map的下标里,判断是否出现的次数是否>0,是则写入输出的数组,出现的次数-1
这边记录第一个数组中值出现的次数,第二个数组每出现一次相同的值,次数-1,达成返回出现次数少的值的目的

代码:
/**
* @param Integer[] $nums1
* @param Integer[] $nums2
*
* @return Integer[]
*/
function intersect($nums1, $nums2)
{
$map = [];

// 记录每个值的数量
foreach ($nums1 as $item) {
if (!isset($map[$item])) {
$map[$item] = 0;
}

$map[$item]++;
}

$data = [];
foreach ($nums2 as $item) {
// 如果存在item在map里且item的值>0
if (isset($map[$item]) && $map[$item] > 0) {
// item的值-1,并且将item写入返回的值中
$map[$item]--;
$data[] = $item;
}
}

return $data;
}