求两个数组元素的交集

实现方式:

  1. 先用hash表记录第一个数组中的元素【放在key】,和出现的次数【放在value】。
  2. 然后再遍历第二个数组,如果找到对应元素,则添加这个元素到返回数组里。
  3. 如果value值大于1,HashMap中的value值减 1,表示已经找到一个相同的了。
  4. 如果value值等于1,则删除该元素。
/**
 * 求两个数组的交集
 * param array $nums1
 * param array $nums2
 * return array
 */
function intersect(array $nums1, array $nums2):array {
	$result = [];
	
	$hash = [];
	for($i=0; $i<count($nums1);$i++){
		if(isset($hash[$nums1[$i]])){
			$hash[$nums1[$i]]++;
		}else{
			$hash[$nums1[$i]] = 1;
		}
	}
	
	for($i=0; $i<count($nums2);$i++){
		if(isset($hash[$nums2[$i]])){
			$result[] = $nums2[$i];
			if($hash[$nums2[$i]] > 1){
				$hash[$nums2[$i]]--;
			}else{
				unset($hash[$nums2[$i]]);
			}
		}
	}
	
	return $result;
}

//example
$nums1 = [4,9,5];
$nums2 = [9,4,9,8,4];
print_r(intersect($nums1, $nums2));

//output
Array
(
    [0] => 9
    [1] => 4
)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值