php求两数组交集的三种方法

题目:

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入:

nums1 = [1,2,2,1],nums2 = [2,2]
输出:

[2]
示例 2:

输入:

nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:

[9,4]
说明:

输出结果中的每个元素一定是唯一的。

我们可以不考虑输出结果的顺序。

解法一:迭代一个数组

思路分析:

迭代一个数组,判断是否存在另外一个数组

PHP 代码实现:

/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer[]
*/
function intersection($nums1, $nums2) {
$res = [];
for($i=0;$i<count($nums1);$i++){
if(in_array($nums1[$i],$nums2)){
$res[] = $nums1[$i];
}
}
return array_unique($res);
}
使用:
$nums2 = [2,4,6,7,8,99];
$nums1 = [1,2,5,9,9,66,89,90,99,99];
var_dump(intersection($nums1, $nums2));
复杂度分析:

时间复杂度:O(mn)

解法二:内置数组函数

思路分析:

使用array_intersect()函数进行取数组的交集,然后再使用array_unique()去重

PHP 代码实现:

/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer[]
*/
function intersection($nums1, $nums2) {
return array_unique(array_intersect($nums1,$nums2));
}
使用:
$nums2 = [2,4,6,7,8,99];
$nums1 = [1,2,5,9,9,66,89,90,99,99];
var_dump(intersection($nums1, $nums2));
解法三:暴力解法

思路分析:

先把两个数组合并为一个数组,再两次循环遍历查找

PHP 代码实现:

/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer[]
*/
function intersection($nums1, $nums2) {
$new_arr = array_merge(array_unique($nums1),array_unique($nums2));
$res = [];
for($i=0;$i<count($new_arr);$i++){
for($j=$i+1;$j<count($new_arr);$j++){
if($new_arr[$i] == $new_arr[$j]){
$res[] = $new_arr[$i];
}
}
}
return array_unique($res);
}
使用:
$nums2 = [2,4,6,7,8,99];
$nums1 = [1,2,5,9,9,66,89,90,99,99];
var_dump(intersection($nums1, $nums2));
复杂度分析:

时间复杂度:O(n^2)

解法四:双指针

思路分析:

先把两个数组排序,通过双指针往前推来进行查找

PHP 代码实现:

/**
* @param Integer[] $nums1
* @param Integer[] $nums2
* @return Integer[]
*/
function intersection($nums1, $nums2) {
sort($nums1);
sort($nums2);
$i = $j = 0;
$res = [];
while($i < count($nums1) && $j < count($nums2)){
if($nums1[$i] == $nums2[$j]){
$res[] = $nums1[$i];
$i++;
$j++;
}elseif($nums1[$i] < $nums2[$j]){
$i++;
}elseif($nums1[$i] > $nums2[$j]){
$j++;
}
}
return array_unique($res);
}
使用:
$nums2 = [2,4,6,7,8,99];
$nums1 = [1,2,5,9,9,66,89,90,99,99];
var_dump(intersection($nums1, $nums2)
复杂度分析:

时间复杂度:O(nlogn)北京代孕威信15023219993 广州代孕威信15023219993 深圳代孕威信15023219993 昆明代孕威信15023219993 上海代孕威信15023219993 天津代孕威信15023219993 成都代孕威信15023219993 北京代孕威信15023219993 重庆代孕威信15023219993 重庆代孕威信15023219993

原文地址:https://www.cnblogs.com/ipengrui2/p/12302927.html

时间: 2024-10-01 04:37:18

php求两数组交集的三种方法的相关文章

JS数组去重的三种方法

<!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">         <title>数组去重</title>     </head>     <body>         <script type="text/javascript">             //注意有一个元素是空的

交换两个整数的三种方法

package com.zby.bubble; /** * <class description> 三种方法交换两个整数的值 * * @author zby * */ public class Exchange { public static void main(String[] args) { splitLine(); exchange1(Integer.MAX_VALUE, Integer.MAX_VALUE - 1); exchange1(99, 100); exchange1(Inte

【JS】JS数组添加元素的三种方法

1.push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 1).语法: arrayObject.push(newelement1,newelement2,....,newelementX) 参数 描述 newelement1 必需.要添加到数组的第一个元素. newelement2 可选.要添加到数组的第二个元素. newelementX 可选.可添加多个元素. 2).返回值: 把指定的值添加到数组后的新长度. 3).说明: push() 方法可把它的参数顺序添加到 arrayO

数组去重的三种方法

arr = [1,1,2,3,2,1,2,3,4,5,1,2,3,4,5]; 方法一: 1.先将数组排序 —> arr.sort(); 2.循环数组,从第0项开始比较当前项与下一项的大小,如果两者相等,则删除数组中的当前项 —> arr.splice(开始位置,删除个数); 3.删除之后还要从删除的当前项[i]开始进行比较 —> i--; var arr = [1,1,2,43,3,2,1,2,3,4,5,1,2,3,4,5];    arr.sort();    for(var i =

Java小案例——交换两个数值的三种方法

要求: 互换两个数的值 方法一:借助第三方变量 /** * 借助第三方变量对两个值进行互换 * @author Administration * */ public class ExchangeValue { public static void main(String[] args) { int a = 10; int b = 15; System.out.println("a的值:"+a+",\tb的值:"+b); System.out.println(&quo

js 数组去重的三种方法(unique)

方法一: Array.prototype.unique=function(){ var arr=[];//新建一个临时数组 for(var i=0;i<this.length;i++){//遍历当前数组 if(arr.indexOf(this[i])==-1){//当前数组的第i个值在新数组中找不到,则添加到新数组中去 arr.push(this[i]); } } return arr; }; 方法二: Array.prototype.unique=function(){ var arr=[];

求最小公公倍数的三种方法

1.常规法 #include<stdio.h> #include<stdlib.h> int main(){ int a, b, i,j; printf("请输入两个数\n"); scanf("%d%d", &a, &b); for (i = 2;i<=a;i++){ if (a%i == 0 && b%i == 0) { j = i; } } printf("最大公约数为:%d",

php保留两位小数的三种方法

around:a.代码: <?php $num1 = round(5,2); $num2 = round(5.123,2); echo $num1.PHP_EOL; echo $num2.PHP_EOL; b.输出: 5 5.12 sprintf:a.代码: <?php $num1 = sprintf('%.2f',5); $num2 = sprintf('%.2f',5.123); echo $num1.PHP_EOL; echo $num2.PHP_EOL; b.输出: 5.00 5.12

C语言编程 求两个数的平均值方法(三种方法)

第一种方法是最常见的average=(a + b) / 2这种方式,求两个数的平均值 第二种方法是当 a<b 时averag=a+(b-a)/2 这里着重介绍的是第三种方法 average=(a&b) + (a^b)>>1 推导过程如下a + b = (a&b) 2 + (a^b)) --->average=((a&b)2+(a^b))/2 ---->average=(a&b) + (a^b)>>1 eg:两个数为15和515二进制