//求两个数组的交集
$a1 = [1,22,33];
$a2 = [22,33,78];
//有序数组双指针法,这个需要将数组先转成有序数组
function doubleKeyIntersect($arr1,$arr2)
{
sort($arr1);
sort($arr2);
//计算两个数组的长度
$len1 = count($arr1);
$len2 = count($arr2);
//初始指针
$k1 = 0;
$k2 = 0;
$intersect = [];
while($k1<$len1 && $k2<$len2){
$v1 = $arr1[$k1];
$v2 = $arr2[$k2];
if($v1 == $v2){
$intersect[] = $v1;
$k1++;
$k2++;
}elseif($v1>$v2){
$k2++;
}else{
$k1++;
}
}
return $intersect;
}
//hash表法
function hashIntersect($arr1,$arr2)
{
//计算两个数组的长度
$len1 = count($arr1);
$len2 = count($arr2);
if($len1>$len2){
$longArr = $arr1;
$shortArr = $arr2;
}else{
$longArr = $arr2;
$shortArr = $arr1;
}
//先将小数组转成hash,将数组的val作为key,这样hash就相对较小,后面在哈希中查找就更快
$hashArr = [];
foreach ($shortArr as $val)
{
$hashArr[$val] = 1;
}
//遍历大数组,看是否在hash的key中,在的话即说明这个val是两个数组的交集
$intersect= [];
foreach ($longArr as $val){
if(isset($hashArr[$val])){
$intersect[] = $val;
}
}
return $intersect;
}